2017-06-28 57 views
0

我有一个包含NAN值的Eigen矩阵A.我想得到这个矩阵的差异总和多个其他矩阵。Eigen矩阵与NAN的总和

double getDistance(const Eigen::MatrixXf& from, const Eigen::MatrixXf& to) 
{ 
    Eigen::MatrixXf difference = (to - from).cwiseAbs2(); 

    difference = difference.unaryExpr([](float v, double& sum) 
    { return std::isnan(v) ? 0.0f : v;}); 

    double distance = difference.sum(); 

    return distance; 
} 

std::vector<double> getDistances(const std::vector<Eigen::MatrixXf>& from, const Eigen::MatrixXf& to) 
{ 
    std::vector<double> distances; 
    for (int i = 0; i < from.size(); ++i) 
    { 
     distances.push_back(getDistance(from[i], to)); 
    } 
    return distances; 
} 

现在我需要删除的NaN difference每一次再取总和。 我正在考虑做我自己的总和功能,跳过NANs。
有没有一个优雅的方式来做到这一点?

unaryExpr难道我们需要一个“输出参数”来总结吗?

+2

你可能会问错了问题。为什么你有nan值? nan in floats是一个错误输入的调试指示。你应该退后一步,在创建它们的地方消除它们,而不是处理它们。 – starmole

+0

矩阵表示传感器输入(Kinect类似深度传感器),实际上表示传感器输入不良(不可测量)。 所以没有办法摆脱他们,我真的希望他们在那里很容易区分有效的数据。 – areimann

回答

2

我建议首先按照starmole建议,但要回答这个问题isNaN和select是给你:

return (to-from).array().isNaN().select(0,to-from).squaredNorm(); 
+0

在这种情况下计算两次? – zhanxw

+1

这取决于编译器删除融合循环内重复的能力。无论如何,由于手术非常便宜,最好做两次而不是暂时评估。 – ggael