外側のストライドは、データ格納に関連するパラメータです。より一般的に使用される名前は、主要な次元です。あなたはここでいくつかの説明を見つけることができます。既存のマトリックスのための基本的
http://www.ibm.com/support/knowledgecenter/SSFHY8_5.3.0/com.ibm.cluster.essl.v5r3.essl100.doc/am5gr_leaddi.htm
、それを変更することはできません。行列の要素を変更せずに変更する唯一の方法は、異なる外側のストライド設定を使用して新しいメモリ空間に行列をコピーすることです。これは通常、行列を別の行列にサブ行列としてコピーするときに発生します。
列の主な行列の場合、可能な最小の外側のストライドは、印刷した数と同じ行数になります。
Eigenを使用している場合、Eigenは通常、あなたがEigen::Map
を期待しているので気にする必要はありません。
実際にはコードは機能しません。 arr
に格納されている既存の行列(4x4)がストライド4でstride 5 x 4 columns = 20 > 16
であるため、ストライドを5に設定することはすでに範囲外です。
#include <iostream>
#include <Eigen/Eigen>
int main(void) {
using namespace Eigen;
MatrixXf mat;
float arr[16] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };
mat = Map<Matrix<float, Dynamic, Dynamic, Eigen::RowMajor>, 0,
OuterStride<Dynamic> >(arr, 4, 4, OuterStride<Dynamic>(5));
std::cout << "mat with stride 5:\n" << mat << std::endl;
mat = Map<Matrix<float, Dynamic, Dynamic, Eigen::RowMajor>, 0,
OuterStride<Dynamic> >(arr, 4, 4, OuterStride<Dynamic>(4));
std::cout << "mat with stride 4:\n" << mat << std::endl;
return 0;
}
出力を比較してください。
mat with stride 5:
1 2 3 4
6 7 8 9
11 12 13 14
16 0 0 5.01639e-14
mat with stride 4:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
あなたは20個の要素
#include <iostream>
#include <Eigen/Eigen>
int main(void) {
using namespace Eigen;
MatrixXf mat;
float arr[20] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 };
Map<Matrix<float, Dynamic, Dynamic, Eigen::RowMajor>, 0, OuterStride<Dynamic> > map1(arr, 4, 4, OuterStride<Dynamic>(5));
mat = map1;
std::cout << "map1 outer stride: " << map1.outerStride() << std::endl << map1 << std::endl;
std::cout << "mat outer stride: " << mat.outerStride() << std::endl << mat << std::endl;
Map<Matrix<float, Dynamic, Dynamic, Eigen::RowMajor>, 0, OuterStride<Dynamic> > map2(arr, 4, 4, OuterStride<Dynamic>(4));
mat = map2;
std::cout << "map2 outer stride: " << map2.outerStride() << std::endl << map2 << std::endl;
std::cout << "mat outer stride: " << mat.outerStride() << std::endl << mat << std::endl;
return 0;
}
に配列を延長した場合、出力はmat
にmap1
をコピーするときにも、外ストライドの変化を見ることができました
map1 outer stride: 5
1 2 3 4
6 7 8 9
11 12 13 14
16 17 18 19
mat outer stride: 4
1 2 3 4
6 7 8 9
11 12 13 14
16 17 18 19
map2 outer stride: 4
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
mat outer stride: 4
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
になります。 これはストライドが何であるかをよりよく理解できるようにしたいと考えています。
実際に元のコードでは、Map
を間違った方法で使用しています。Map()
からMatrix mat
にコピーしてはいけません。 そのため、mat
のストライドを印刷すると、常に4になります。 不要なデータコピーを削除し、ストライドmap1
/map2
を印刷するだけです。
なぜ変更しますか?あなたはそれをどのように変更するかについていくつかのコードを表示できますか? – kangshiyin
私は、異なるストライドのマトリックスで作業したいです。 – Martin
あなたはより具体的になることができますか?私はそれを変更する必要がある共通の行列演算があるとは想像もできません。 – kangshiyin