テンソル解析の記号と行列の積

行列のかけ算は、テンソル解析の書き方で書くと、
  a_{ij}b_{jk}=c_{ik}
ですね。ここでEinsteinの総和規約を使ってます。
っつーことで、数値的に行列の積を求める場合はこれを書き下すだけでOKです。実際かなりふざけたコードになります。なんつーか上の式そのまんまみたいな。

#include <stdio.h>
#define N 3

int main () {
  double A[N][N], B[N][N], C[N][N];
  int i, j, k;

  A[0][0] = 1.0; A[0][1] = 2.0; A[0][2] = 3.0;
  A[1][0] = 0.1; A[1][1] = 0.2; A[1][2] = 0.3;
  A[2][0] = 0.5; A[2][1] = 0.6; A[2][2] = 0.7;

  B[0][0] = 5.0; B[0][1] = 6.0; B[0][2] = 7.0;
  B[1][0] = 2.0; B[1][1] = 3.0; B[1][2] = 4.0;
  B[2][0] = 4.0; B[2][1] = 5.0; B[2][2] = 6.0;

  for (i = 0; i < N; i++) {
    for (j = 0; j < N; j++) {
      C[i][j] = 0.0;
    }
  }

  for (i = 0; i < N; i++){
    for (j = 0; j < N; j++) {
      for (k = 0; k < N; k++) {
	C[i][k] += A[i][j]*B[j][k];
      }
    }
  }
  for (i = 0; i < N; i++) {
    for (j = 0; j < N; j++) {
      printf("%lf, ", C[i][j]);
    }
    printf("\n");
  }
  return 0;
}

こんな感じでかなりふざけてますが、ちゃんと値は出ます。っつーかテンソル解析って、テンソル解析の公式を使って考えるのはちょっと難しいものがありますが、頭の中を整理する道具としては仲々使える感じです。