Библиотека линейной алгебры Armadillo C ++: как создать вектор логического типа

Недавно я начал использовать библиотеку Armadillo C ++. Учитывая, что мои навыки программирования на C ++ не так хороши, я нашел это очень удобным для линейной алгебры. Я также использую это вместе с моей Matlab, чтобы ускорить работу многих алгоритмов реконструкции.

Мне действительно нужно создать вектор логического значения, и я бы предпочел использовать эту библиотеку, а не. Однако я не мог понять, как это сделать. Пробовал использовать увек; но в документации, похоже, указано, что его нельзя использовать с логическим значением.

Любая помощь будет оценена.

С уважением, Душянт


person Garima Singh    schedule 19.09.2013    source источник
comment
Armadillo обычно использует umat и uvec для представления матриц и векторов, хранящих логические значения.   -  person mtall    schedule 02.04.2014
comment
У меня тот же вопрос, и я ожидаю, что ответ будет vector <bool>, что занимает меньше места, чем vector <char>   -  person kirill_igum    schedule 30.10.2014


Ответы (1)


Рассмотрите возможность использования матрицы uchar_mat, которая является определением типа для Mat<unsigned char>, она должна потреблять тот же объем памяти, что и матрица логических значений.

В документации Armadillo версии 7.8 указано, что матрица Mat<type> может быть следующих типов : Версии float, double, std::complex<float>, std::complex<double>, short, int, long и unsigned short, int и long. Однако код на GitHub содержит typedef Mat <unsigned char> uchar_mat; в файле include / armadillo_bits / typedef_mat.hpp, поэтому вы также сможете использовать uchar_mat.

Вы не сэкономите память, создав матрицу из bool значений по сравнению с матрицей из unsigned char значений (тип bool потребляет 8 бит). Это связано с тем, что в C ++ каждый тип данных должен быть адресуемым; он должен быть не менее 1 байта, чтобы можно было создать указатель, указывающий на него.

person Svaberg    schedule 02.04.2014
comment
vector <bool> занимает намного меньше памяти, чем vector <char> - person kirill_igum; 30.10.2014
comment
@kirill_igum вы имеете в виду std::vector<bool>? Это специализированная версия std::vector, которая оптимизирует пространство. Я не думаю, что подобный механизм существует в библиотеке Armadillo. Итак, действительно, в зависимости от того, что вы хотите сделать, вам может быть лучше использовать векторный класс пространства имен std. - person Svaberg; 31.10.2014
comment
Я знаю, что этот ответ старый, но когда я смотрю на документ с броненосцем, там нет доступного типа char. Как я могу это сделать сейчас? - person v.tralala; 18.04.2017
comment
Вы правы, в документации char больше не упоминается. Тем не менее, похоже, что он все еще поддерживается в коде. Какую ошибку вы получили при попытке использовать Mat<unsigned char>? - person Svaberg; 18.04.2017
comment
Есть даже выражение typedef Mat <unsigned char> uchar_mat; в файле include / armadillo_bits /typedef_mat.hpp, поэтому вы также сможете использовать uchar_mat. - person Svaberg; 18.04.2017