特征矩阵库系数模运算

时间:2016-03-04 14:37:25

标签: c++ eigen eigen3

在我正在研究的项目中的一个函数中,我需要在除以给定数字时找到我的特征库矩阵的每个元素的剩余部分。这是Matlab等同于我想要做的事情:

mod(X,num)

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

实现这一目标的最简单方法是什么?

2 个答案:

答案 0 :(得分:3)

您可以将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 :(得分:0)

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

  1. 将X转换为特征数组(用于系数运算),
  2. 应用模数公式a%b = a - (b * int(a/b))
  3. 返回特征数组的C ++代码:

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

    获取矩阵的C ++代码:

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

    请注意,括号非常重要,特别是在(X.array()/num)中,因为eigen会优化(num * X.array()/num)X.array(),这不是我们所期望的。

    带有特征数组的第一个版本比带有unaryExpr的版本更快。 带有矩阵的第二个版本与使用unaryExpr的版本大致相同。

    如果X包含浮点数,则需要将X.array()中的(X.array()/num)转换为int