ロー優先ストレージとカラム優先ストレージ
3971 ワード
行列の行優先と列優先ストレージとは何か分からないまま、今はEigenのtutorialを見て、行優先と列優先とは何かを詳しく説明して、ここでメモをとります.
マトリクスを探して説明しましょう.例えば、次のようなマトリクスaです.
1, 3, 5 4, 2, 6, 7, 8, 9
これは3行3列のマトリクスであることはよく知られていますが、コンピュータメモリに格納されると、線形の格納、つまりすべてのマトリクスの要素が1行に格納されます.行優先記憶であれば、マトリクスaはメモリに1,3,5,4,2,6,7,8,9として記憶される.カラム優先記憶を使用する場合、マトリクスaはメモリに1,4,7,3,2,8,5,6,9として格納される.
上記の例をEigenコードで説明することができます.data()関数は、マトリクスの最初の要素のアドレスを返します.
結果:
同じマトリクスがメモリに異なる格納方式で格納されていることがわかる.
ロー優先ループの場合はロー優先ストレージ、カラム優先ループの場合はカラム優先ストレージを使用します.Eigenのデフォルトでは、カラム優先ストレージが使用されます.
行優先および列優先ストレージ
マトリクスを探して説明しましょう.例えば、次のようなマトリクスaです.
1, 3, 5 4, 2, 6, 7, 8, 9
これは3行3列のマトリクスであることはよく知られていますが、コンピュータメモリに格納されると、線形の格納、つまりすべてのマトリクスの要素が1行に格納されます.行優先記憶であれば、マトリクスaはメモリに1,3,5,4,2,6,7,8,9として記憶される.カラム優先記憶を使用する場合、マトリクスaはメモリに1,4,7,3,2,8,5,6,9として格納される.
Eigenコード
上記の例をEigenコードで説明することができます.data()関数は、マトリクスの最初の要素のアドレスを返します.
#include
#include
using namespace Eigen;
using namespace std;
int main()
{
Matrix<int, 2, 3, ColMajor> Acolmajor;
// Acolmajor << 8, 2, 2, 9,
// 9, 1, 4, 4,
// 3, 5, 4, 5;
Acolmajor << 1, 2, 3,
4, 5, 6;
cout << Acolmajor << endl;
cout << "In memory" << endl;
for (int i = 0; i < 6; i++) cout << *(Acolmajor.data() + i) << endl;
Matrix<int, 2, 3, RowMajor> Arowmajor;
Arowmajor << 1, 2, 3,
4, 5, 6;
cout << Arowmajor << endl;
cout << "In memory" << endl;
for (int i = 0; i < 6; i++) cout << *(Arowmajor.data() + i) << endl;
}
結果:
1 2 3
4 5 6
In memory
1
4
2
5
3
6
1 2 3
4 5 6
In memory
1
2
3
4
5
6
同じマトリクスがメモリに異なる格納方式で格納されていることがわかる.
どのストレージを使用するかを選択します。
ロー優先ループの場合はロー優先ストレージ、カラム優先ループの場合はカラム優先ストレージを使用します.Eigenのデフォルトでは、カラム優先ストレージが使用されます.