され今回は二次元配列の勉強です。行列の計算を例に説明していくので、よろしくお願いします。
メモリ上の二次元配列
上記の写真の通り概念的には表みたいな感じですが、実体は一次元配列と同様に、連続した領域に並んでいるのです。
行列の値の入力と出力
入力と出力なので、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行列の時のみなので、注意が必要です。
以上で終了となります。
次回は行列の和と積のプログラミングを勉強していきます。最後までありがとうございました。
コメント