2017-06-28 3 views
0

私はNAN値を含む固有行列Aを持っています。私は、この行列の差の合計を複数の他の行列に掛けたいと思っています。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; 
} 

は、今私はdifferenceの一つ一つの時間をNaNを削除し、合計を取る必要があります。 NANをスキップする自分自身のサム関数を実行することを考えていました。
これを行うにはエレガントな方法がありますか?

unaryExprは「outパラメータ」が必要な箇所を集計しますか?

+2

あなたは間違った質問をされることがあります。なぜあなたはナノ値を持っていますか?浮動小数点数は不良入力のデバッグ表示です。あなたは本当に一歩後退し、それらを扱う代わりに、それらが作成された時点で削除する必要があります。 – starmole

+0

マトリックスはセンサー入力(Kinectのような深さセンサー)を表し、センサーからの悪い入力(測定不可能な距離)を表します。 それを取り除く方法はありません。実際には、有効なデータと簡単に区別してほしいと思っています。 – areimann

答えて

2

私が最初にstarmole勧告に従うことをお勧めしますが、ますisNaNと選択があなたのためにある質問に答えるために:

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

この場合、「to-from」は2回計算されますか? – zhanxw

+1

これは、融合ループ内の複製を削除するコンパイラ機能に依存します。とにかく、操作が非常に安いので、それを一時的に評価するより2倍するほうがよいでしょう。 – ggael