Как сгенерировать эту матрицу с броненосцем в C ++? - PullRequest
0 голосов
/ 21 января 2019

Я хотел бы сгенерировать матрицу в C ++, используя броненосец, который ведет себя как «таблица истинности», например:

0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1

Я думал о цикле такого рода, но я не очень практичен с броненосцем и его структурами данных.

imat A = zeros<imat>(8, 3);

/* fill each row */
for(int i=0; i < 8; i++)
{
    A.row(i) = (i/(pow(2, i)))%2 * ones<ivec>(3).t();  // 
}

cout << "A = \n" << A << endl;

Есть идеи?

1 Ответ

0 голосов
/ 23 января 2019

Если вам нужен большой размер таблица истинности матрица (~ 2^30 x 30), как вы сказали здесь , с точки зрения памяти, вы должны реализоватьфункция, которая быстро вычисляет нужные значения, а не сохраняет их в матрице.

Это легко сделать с помощью std::bitset следующим образом.Обратите внимание, что N должен быть определен во время компиляции в этом методе.Тогда вы можете получить значение вашего A(i,j) по matrix<3>(i,j):

DEMO

#include <bitset>

template <std::size_t N>
std::size_t matrix(std::size_t i, std::size_t j)
{
    return std::bitset<N>(i)[N-j-1];
}
...