Для полноты, другое решение было бы:
- преобразование X в (для операций с коэффициентом),
- Применить 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
чека http://arma.sourceforge.net/ они имеют хорошую библиотеку с методами, которые делают то, что вы хотите, а также руководство для преобразования из Matlab. – Jacobr365
Я использовал Armadillo в прошлом, но я хотел попробовать Eigen для этого проекта. Разве это невозможно сделать в Эйгене? – pincir
Не то, чтобы я знал. Вы можете написать свою собственную функцию мод, используя другие функции в собственном для выполнения необходимых операций, чтобы получить тот же эффект от mod() – Jacobr365