特征矩阵库系数模运算
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; });
为了完整起见,另一个解决方案是:
- 将 X 转换为特征数组(用于系数运算),
- 应用模数公式
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
在我正在处理的项目中的一个函数中,我需要找到我的特征库矩阵的每个元素除以给定数字后的余数。这是与我想做的等效的 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; });
为了完整起见,另一个解决方案是:
- 将 X 转换为特征数组(用于系数运算),
- 应用模数公式
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