2017-06-28 76 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