2015-03-03 96 views
1

在MATLAB中,您可以通过阈值一个矩阵如下创建一个二进制矩阵B:有没有一种方法来存储阈值操作输出特征(C++)?

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; 

and

M = M < 1; 

都给出了构建错误。

有人可以请解释正确的方法来保存这个阈值的二进制输出到一个变量吗?

回答

4

operator<仅被定义在阵列的世界,所以你必须使用.array()看你MatrixXdArrayXXd(没有复制在这里),然后将结果是布尔的阵列,所以如果你想双,那么你必须明确地施展:

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

有一点需要指出的是我不相信MatrixXb有一个gobal typedef,所以有必要自己做:typedef Matrix MatrixXb; – marcman 2015-03-03 16:05:27

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

+0

你知道吗?我想这可能是因为我在使用ArrayXXd。如果您将MatrixXd转换为ArrayXXd,您应该会看到我的cout结果。至于存储在一个真正的矩阵,我想它可以是一个布尔值。最后一部分:我不认为我明白你对显式转换的含义。你介意阐述吗? – marcman 2015-03-03 06:17:43

+1

@marcman在Eigen中,'MatrixXd + MatrixXd'的结果类型不是*'MatrixXd',而是一些可以隐式转换为'MatrixXd'的特殊表达式模板。但这种转换是懒惰地完成的。这样做的好处是,如果您在另一个表达式中使用前一个表达式的结果,而不是在矩阵元素上循环两次,Eigen内核就能够将这些操作融合到一个更高效的缓存循环中。 – 5gon12eder 2015-03-03 18:43:08

相关问题