3

たとえば k-means に必要な行列間のペアワイズ距離は、次元 x の 2 つの行列を引数として 1 回の関数呼び出し ( cvKmeans.m を参照matlab)で計算さます。octavedistFunc(Codebook, X)KD

これは、 eigen.tuxfamily.orgEigenで説明されているように、ブロードキャストを使用して行列と 1 つのベクトルに対して実行できます。

 (m.colwise() - v).colwise().squaredNorm().minCoeff(&index);

ただし、この場合vは単なるベクトルではなく行列です。2つの行列間のすべてのエントリでそのようなペアワイズ(ユークリッド)距離を計算するためのEigenの同等のワンライナーは何ですか?

4

2 に答える 2

0

固有値は、私が一目で思ったよりも頭痛の種です。

  1. reshape()たとえば、機能はありません(そしてconservativeResize他のものです)。
  2. Mapまた、データのビューを提供するだけでなく、一時変数への割り当てが必要なように見える場合もあります (修正したいのですが) 。
  3. 演算子の後のminCoeff関数はcolwise、最小要素とその要素へのインデックスを返すことができません。
  4. replicate実際にデータの重複を割り当てているかどうかは不明です。ブロードキャストの背後にある理由は、これが必要ないからです。

    matrix_t data(2,4);
    matrix_t means(2,2);
    
    // data points
    data << 1, 23, 6, 9,
            3, 11, 7, 2;
    
    // means
    means << 2, 20,
             3, 10;
    
    std::cout << "Data: " << std::endl;
    std::cout << data.replicate(2,1) << std::endl;
    
    column_vector_t temp1(4);
    temp1 = Eigen::Map<column_vector_t>(means.data(),4);
    
    std::cout << "Means: " << std::endl;
    std::cout << temp1.replicate(1,4) << std::endl;
    
    matrix_t temp2(4,4);
    temp2 = (data.replicate(2,1) - temp1.replicate(1,4));
    std::cout << "Differences: " << std::endl;
    std::cout << temp2 << std::endl; 
    
    matrix_t temp3(2,8);
    temp3 = Eigen::Map<matrix_t>(temp2.data(),2,8);
    std::cout << "Remap to 2xF: " << std::endl;
    std::cout << temp3 << std::endl;
    
    matrix_t temp4(1,8);
    temp4 = temp3.colwise().squaredNorm();
    std::cout << "Squared norm: " << std::endl;
    std::cout << temp4 << std::endl;//.minCoeff(&index);
    
    matrix_t temp5(2,4);
    temp5 = Eigen::Map<matrix_t>(temp4.data(),2,4);
    std::cout << "Squared norm result, the distances: " << std::endl;
    std::cout << temp5.transpose() << std::endl;
    
    //matrix_t::Index x, y;
    std::cout << "Cannot get the indices: " << std::endl;
    std::cout << temp5.transpose().colwise().minCoeff() << std::endl; // .minCoeff(&x,&y);
    

これは素晴らしいワンライナーではなく、すべての列dataをすべての列と比較meansし、それらの違いを含む行列を返すだけではやり過ぎのようです。ただし、Eigen の汎用性は、これをはるかに短く書き留めることができるほどではないようです。

于 2013-10-10T13:08:11.200 に答える