2017-07-17 17 views
0

奇妙な固有マップ挙動<a href="https://eigen.tuxfamily.org/dox/classEigen_1_1Stride.html" rel="nofollow noreferrer">Eigen::Stride</a>ドキュメントから

内側ストライドは、2つの連続 エントリ間のポインタの増分は、行優先行列の所与の行内または所与の カラム内であります列 - 主要マトリックス。

外側のストライドは、行主行列の2つの連続する行 間、または 列主行列の2つの連続する列の間のポインタの増分です。

言い換えれば、繰り返されるベクトルからなる行列を行として作成したいとしましょう。私はこれを行うにはゼロの長さのストライドを使用することができますpythonでnumpy。固有のドキュメントは、何もほぼゼロ進歩が、動作は非常に奇妙に見えると言う:

typedef Matrix<float, Dynamic, Dynamic, RowMajor> MatrixType; 

MatrixType M1(3, 3); 
M1 << 1, 2, 3, 
     4, 5, 6, 
     7, 8, 9; 

Map<MatrixType, 0, Stride<0, 0>> zeroMap(M1.data(), 2, 2); 
Map<MatrixType, 0, Stride<2, 0>> oneMap(M1.data(), 2, 2); 

cout << "Row stride = 0:" << "\n"; 
cout << zeroMap << "\n" << "Row stride = 2:" << "\n"; 
cout << oneMap; 
cout << "\n"; 

はどちらの場合も同じ結果を返します:

Row stride = 0: 
1 2 
3 4 
Row stride = 2: 
1 2 
3 4 

をなぜ結果がストライド0とストライド2と同じですか?

答えて

2

コンパイル時に0のストライドは、Eigenの「自然なストライド」を意味します。また、テンプレート引数または(あなたが実際に必要なものに応じて)実行時の引数を持つ.rowwise().replicate().colwise().replicate()、それぞれを見て

M1.row(0).replicate<3,1>(); 

:あなたは、ベクトルを複数回繰り返したい場合は、.replicate()機能を使用する必要があります。

関連する問題