I am Charmie

メモとログ

Eigen: select columns with N largest norm

The following code selects columns with N largest norm. The output should be

All data and its norm: data[0] = ( 68.0375 -21.1234) norm = 71.2412 data[1] = (56.6198 59.688) norm = 82.2707 data[2] = ( 82.3295 -60.4897) norm = 102.162 data[3] = (-32.9554 53.6459) norm = 62.9599 data[4] = (-44.4451 10.794) norm = 45.737 data[5] = (-4.52059 25.7742) norm = 26.1676 data[6] = (-27.0431 2.68018) norm = 27.1756 data[7] = (90.4459 83.239) norm = 122.919 data[8] = (27.1423 43.4594) norm = 51.2389 data[9] = (-71.6795 21.3938) norm = 74.804 Selected data with 3largest norm: data[0] = (90.4459 83.239) original index = 7 data[1] = ( 82.3295 -60.4897) original index = 2 data[2] = (56.6198 59.688) original index = 1

[code lang="cpp"]

include <Eigen/Core>;

include <iostream>;

include <vector>;

int main() { int dimData = 2; int numData = 10; int numDataSub = 3; Eigen::MatrixXd m = 100.0*Eigen::MatrixXd::Random(dimData, numData); Eigen::MatrixXd mSub = Eigen::MatrixXd::Zero(dimData, numDataSub); Eigen::VectorXd mNorm = m.colwise().norm(); std::vector<int>; indexMax(numDataSub);

std::cout &lt;&lt; &quot;All data and its norm:&quot; &lt;&lt; std::endl;
for(int n = 0; n &lt; numData; ++n)
{
    std::cout &lt;&lt; &quot;   data[&quot; &lt;&lt; n &lt;&lt; &quot;] = (&quot; &lt;&lt; m.col(n).transpose() &lt;&lt; &quot;)    norm = &quot; &lt;&lt; mNorm(n) &lt;&lt; std::endl;     
}

// retrieve columns whose norm  is top numDataSub
for(int n = 0; n &lt; numDataSub; ++n)
{
    mNorm.maxCoeff(&amp;amp;indexMax[n]);
    mNorm(indexMax[n]) = 0.0;
    mSub.col(n) = m.col(indexMax[n]);
}
std::cout &lt;&lt; &quot;Selected data with &quot; &lt;&lt; numDataSub &lt;&lt; &quot;largest norm:&quot; &lt;&lt; std::endl;
for(int n = 0; n &lt; numDataSub; ++n)
{
    std::cout &lt;&lt; &quot;   data[&quot; &lt;&lt; n &lt;&lt; &quot;] = (&quot; &lt;&lt; mSub.col(n).transpose() &lt;&lt; &quot;) original index = &quot; &lt;&lt; indexMax[n] &lt;&lt; std::endl;        
}

return 0;

} [/code]