[c言語] 二次元配列 入力、出力、逆行列について

C言語

され今回は二次元配列の勉強です。行列の計算を例に説明していくので、よろしくお願いします。

メモリ上の二次元配列

上記の写真の通り概念的には表みたいな感じですが、実体は一次元配列と同様に、連続した領域に並んでいるのです。

行列の値の入力と出力

入力と出力なので、printf関数とscanf関数を使っていきます。

#include <stdio.h>
int main(void){
  int i,j;
  int a[2][3];

  printf("行列の値を入力します\n");
  for(i=0; i<2; i++){
    for(j=0; j<3; j++){
      scanf("%d",&a[i][j]);
    }
  }

  printf("出力します\n");
  for(i=0; i<2; i++){
    for(j=0; j<3; j++){
      printf("%d ",a[i][j]);
    }
    printf("\n");
  }

  return 0;

}

/*実行結果
行列の値を入力します
1 2 3
4 5 6
出力します
1 2 3 
4 5 6 
*/

流れ的には下記のような画像のようになります。

(i,j)=(0,0)から始まって(0,1),(0.2)になってj=2になったのでi=1,j=0にして、(1,0),(1,1),(1,2)になって終了となります。

2×2行列の逆行列を表示してみよう

#include <stdio.h>
int main(void){
  int i,j;
  int a[2][2];
  double b[2][2];

  printf("行列の値を入力します\n");

  for(i=0; i<2; i++){
    for(j=0; j<2; j++){
      scanf("%d",&a[i][j]);
    }
  }

  int det=a[0][0]*a[1][1]-a[0][1]*a[1][0];
  b[0][0]=(double)a[1][1]/det;
  b[0][1]=(double)a[0][1]/(-det);
  b[1][0]=(double)a[1][0]/(-det);
  b[1][1]=(double)a[0][0]/det;

  printf("逆行列を出力します\n");

  for(i=0; i<2; i++){
    for(j=0; j<2; j++){
      printf("%.1f ",b[i][j]);
    }
    printf("\n");
  }

  return 0;

}

2×2行列の逆行列の計算は知っていますか?

一応確認しておきましょう。

ad-bcは行列式の値のことですね。

簡単に説明すると、dとaを入れ替えて、b,cは位置はそのままでマイナスをかけるといった感じです。

そして最後に行列式の値を割って逆行列を求めることができます。

この計算は2×2行列の時のみなので、注意が必要です。

以上で終了となります。

次回は行列の和と積のプログラミングを勉強していきます。最後までありがとうございました。

コメント

タイトルとURLをコピーしました