在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;
都会造成构建错误。
有人可以解释将此阈值的二进制输出保存到变量的正确方法吗?
答案 0 :(得分:4)
operator<
仅在数组世界中定义,因此您必须使用.array()
将MatrixXd
视为ArrayXXd
(否)复制到这里),然后结果是一个boolean数组,所以如果你想要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
答案 1 :(得分: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
。