BLOGホームページ制作関係C言語

C言語で行列の掛け算をしてみよう

2019/11/08

はじめに

学校の課題で、C言語で行列を計算する課題が出たのですが、やり方がわかりません。どうしたらいいんでしょうか・・

行列の手計算はできますか?

行列の計算は手計算ではできます。

それならゆっくり 計算工程を観察して見てください。基本的なループを繰り返すだけで計算可能なはずです。

一個一個の計算過程をよく考えて見ます。

プログラムに慣れていない方が、はまりがちなのは、ループの数なのでサンプルで計算方法をご紹介しましょう。

C言語で3x3行列のかけ算をしてみよう

C言語で3x3の行列のかけ算をしてみようと思います。
2つ適当に行列を定義して、結果の出力用の行列も定義します。
行列の計算方法を考えますと、1行目1列目の成分を考えたとき、左の1行目と右の1列目の内積を取ることで、計算結果が出るかと思います。
そう考えますと、まずどの成分を計算するのかというループと各成分要素の内積を計算するループで構成されることがわかるかと思います。

for(i=0;i<N;i++){
  for(j=0;<N;j++){
   result[i][j]=ここに内積を計算したい。
  }
}

上記のような2重ループでは、行列の積を計算する際、1行目1成分を指定することはできますが、左から1行目と右の1行目の内積を計算することはできません。
そのため、行列の積を計算するときは必然的に次のような形になるかと思います。

for(i=0;i<N;i++){
  for(j=0;<N;j++){
    for(k=0;k<N;k++){
      result[i][j]+=matrix1[i][k]*matrix2[k][j];
    }
  }
}

上記のようにコードを定義することで、i行目のj列目の要素の内積を計算することができるようになります。
サンプルコードは次のようになります。

#include<stdio.h>
#include<stdlib.h>
#include<math.h>

int main(){
  double matrix1[3][3]={
                        1,2,3,
                        2,3,4,
                        3,4,5,
  };
  double matrix2[3][3]={
                        1,1,1,
                        1,1,1,
                        1,1,1,
  };
  double result[3][3];
  int i,j,k;
  for(i=0;i<3;i++){
    for(j=0;j<3;j++){
      result[i][j]=0.0;
    }
  }
  for(i=0;i<3;i++){
    for(j=0;j<3;j++){
      for(k=0;k<3;k++){
        result[i][j]+=matrix1[i][k]*matrix2[k][j];
      }
    }
  }

  for(i=0;i<3;i++){
    for(j=0;j<3;j++){
      printf("%lf ",result[i][j]);
    }
    printf("\n");
  }
  return 0;
}

上記の計算結果は、次の通りになります。

6.000000 6.000000 6.000000
9.000000 9.000000 9.000000
12.000000 12.000000 12.000000

a11の要素は、1×1+2×1+3×1=6となるため、手計算結果とも一致するかと思います。