C言語での多次元配列の演算

行列の row (行) の値は y 縦の長さ、 col (列) の値は x 横の長さのイメージ。(2×3) 行列は 2 row, 3 col。

行列計算なので、a_col と b_row が一致していないと計算できない。

レイアウトのイメージ

要素数が増えてくると混乱するが、float a[5][2] でも、float a[2][5] メモリー上は一緒。なんなら float a[1][1][2][5]とかなってもメモリー上は一緒。

生のアドレス計算(オフセット)だと混乱するため、添字からアクセスするためのレイアウトを定義しているだけ。

行列へのアクセス

float a[50*25]; float a[50][25];
25個の組みが50個並んでる。横に25、縦に50並んでいるイメージを持つ。

float *a = new float[50 * 25];
    for (int i = 0; i < 50; ++i ) {
        for (int j = 0; j < 25; ++j ) {
            a[i * 25 + j] = i * 25 + j;
            std::cout << a[i * 25 + j] << " ";
    }
} 

行列積

 float* A = new float[ 2 * 3 ];
 float* B = new float[ 3 * 5 );
 float* C = new float[ 2 * 5 ];
 
 for (int i = 0; i < 2; ++i ) {
     for (int j = 0; j < 5; ++j ) {
         float dc = 0.0;
         for (int k = 0; k < 3; ++k) {
             dc += A[ i * 3 + k ] * B[ k * 5 + j ];
         }
         
         C[i * 5 + j] = dc;
     }
 } 

参考
https://www.cspp.cc.u-tokyo.ac.jp/hanawa/class/spc2016s/sp20160607-2.pdf