特征矩阵库系数模运算

Eigen matrix library coefficient-wise modulo operation

在我正在处理的项目中的一个函数中,我需要找到我的特征库矩阵的每个元素除以给定数字后的余数。这是与我想做的等效的 Matlab:

mod(X,num)

其中 X 是被除数矩阵,num 是除数。

实现此目的最简单的方法是什么?

您可以使用 C++11 lambda 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; });

为了完整起见,另一个解决方案是:

  1. 将 X 转换为特征数组(用于系数运算),
  2. 应用模数公式a%b = a - (b * int(a/b))

C++ 代码 return 特征数组:

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()/num) 中的 X.array() 转换为 int