有没有办法在 Eigen (C++) 中存储阈值操作输出?

Is there a way to store thresholding operation output in Eigen (C++)?

在 MATLAB 中,您可以通过对矩阵 A 进行阈值化来创建二进制矩阵 B,如下所示:

B = A > threshold

其中 threshold 是某个值。在 Eigen for C++ 中,我已经能够看到类似的结果,但遇到无法分配输出的问题。即给定

MatrixXd M =
0 1 2
0 1 2
0 1 2

(我知道这不是正确的初始化,但为了这个问题,继续吧)

cout << (M < 1)

生产

1 0 0
1 0 0
1 0 0

但是

MatrixXd N = M < 1;

M = M < 1;

两者都给出构建错误。

有人可以解释将此阈值的二进制输出保存到变量的正确方法吗?

我无法使用 std::cout << (M < 1) 重现您的结果,也无法在任何地方找到此记录。

您可以通过使用 unaryExpr 成员函数对每个元素应用一元函数,从现有矩阵创建新矩阵。使用 C++11 lambda 表达式,这变得非常简单。

#include <iostream>
#include <Eigen/Dense>

int
main()
{
  Eigen::MatrixXd m1(4, 3);
  m1.setRandom();
  Eigen::MatrixXd m2 = m1.unaryExpr([](double d){ return d < 0.5; });
  std::cout << m1 << "\n\n" << m2 << "\n";
}

可能的输出:

  0.680375   0.823295  -0.444451
 -0.211234  -0.604897    0.10794
  0.566198  -0.329554 -0.0452059
   0.59688   0.536459   0.257742

0 0 1
1 1 1
0 1 1
0 0 1

并不是说我确切知道您为什么希望将布尔运算的结果存储在真实矩阵中,但您当然可以这样做。此外,通常应避免将矩阵表达式的结果显式转换为 MatrixXd(或任何其他显式类型),因为每次这样做时,都会在 Eigen 强大的表达式模板链接中设置一个切口。在 C++11 中,经常使用 auto 除非你真的需要急切的求值/类型转换。

operator< 仅在 array 世界中定义,因此您必须使用 .array() 才能将 MatrixXd 视为 ArrayXXd(这里没有复制),然后结果是一个布尔数组,所以如果你想要double,那么你必须显式转换:

MatrixXd M(3,3);
M << 0, 1, 2,
     0, 1, 2,
     0, 1, 2;
MatrixXb Rb = (M.array() < 0.5);                 // result as a matrix of bool
MatrixXd Rd = (M.array() < 0.5).cast<double>();  // result as a matrix of double