2016-03-04 5 views
2

В одной из функций проекта, над которой я работаю, мне нужно найти остальную часть каждого элемента моей собственной библиотечной матрицы при делении на заданное число. Вот эквивалент Matlab, что я хочу сделать:Кодирование по модулю по матричной библиотеке

mod(X,num) 

где X является матрицей дивиденда и Num является делителем.

Что такое самый простой способ достичь этого?

+0

чека http://arma.sourceforge.net/ они имеют хорошую библиотеку с методами, которые делают то, что вы хотите, а также руководство для преобразования из Matlab. – Jacobr365

+0

Я использовал Armadillo в прошлом, но я хотел попробовать Eigen для этого проекта. Разве это невозможно сделать в Эйгене? – pincir

+0

Не то, чтобы я знал. Вы можете написать свою собственную функцию мод, используя другие функции в собственном для выполнения необходимых операций, чтобы получить тот же эффект от mod() – Jacobr365

ответ

2

Вы можете использовать C++ 11 лямбда а с unaryExpr:

MatrixXi A(4,4), B; 
A.setRandom(); 
B = A.unaryExpr([](const int x) { return x%2; }); 

или:

int l = 2; 
B = A.unaryExpr([&](const int x) { return x%l; }); 
+0

Спасибо, что работает :) – pincir

0

Для полноты, другое решение было бы:

  1. преобразование X в (для операций с коэффициентом),
  2. Применить modulo fo rmula a%b = a - (b * int(a/b))

C++ код, который возвращает собственные векторы массив:

auto mod_array = X.array() - (num * (X.array()/num)); 

C++ код, чтобы получить матрицу:

auto mod_matrix = (X.array() - (num * (X.array()/num))).matrix(); 

Обратите внимание, что круглые скобки имеют важное значение, особенно в (X.array()/num), как собственное оптимизируют (num * X.array()/num) до X.array(), что мы не ожидаем.

Первая версия с собственным массивом работает быстрее, чем версия с unaryExpr. Вторая версия с матрицей занимает примерно то же время, что и версия с unaryExpr.

Если X содержит число с плавающей точкой, вам нужно будет бросить X.array() в (X.array()/num) к Int