【问题标题】:Eigen matrix library coefficient-wise modulo operation特征矩阵库系数模运算
【发布时间】:2016-03-04 14:37:24
【问题描述】:

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

mod(X,num)

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

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

【问题讨论】:

  • 我过去使用过犰狳,但我想在这个项目中试用 Eigen。有没有办法在 Eigen 中做到这一点?
  • 我不知道。您可以使用 eigen 中的其他函数编写自己的 mod 函数来执行所需的操作以获得与 mod() 相同的效果
  • @Jacobr365:我在 arma 的文档中看不到这样的方法,也看不到 arma 的源代码。
  • Arma 没有这样的方法。 @ggael 的解决方案虽然有效。

标签: c++ eigen eigen3


【解决方案1】:

您可以将 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; });

【讨论】:

    【解决方案2】:

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

    1. 将 X 转换为特征数组(用于 coeffwise 运算),
    2. 应用模公式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) 中,因为 eigen 会将 (num * X.array()/num) 优化为 X.array(),这不是我们所期望的。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-25
      相关资源
      最近更新 更多