整数の掛け算はできるけど行列の掛け算はどうやるのかわからない。。
プログラムを一つずつみていきながら、一緒に完成させましょう♪
ここでは行列の積を計算するプログラムを一つ一つ手順を踏みながら完成させます。
配列を使っていきますので、復習したい方は以下を参考にしてください。
その1:構造を簡単に考える
まずはプログラムの全体像を考えていきましょう。
そうすることで、何を書いていけばいいのかがわかりやすくなります!
今回は行列の積を計算するプログラムを作りたいので、配列の積が出力されるようにします。
今回の行列は事前にコードの中に値を入れておいて計算するものを作ります。
プログラムを実行してから値を入力するものではないことに注意してください。
コードの中に行列の値を入れておいて、実行すると積が表示されるものを作ります!
その2:コードを書いていく
それでは大体のイメージがついたので、プログラムを書いていきましょう♪
/*行列Aと行列Bの積を出すプログラム*/
#include <stdio.h>
int main(void) {
return 0;
}
この部分は簡単なプログラムだと変わらないのでパパッと書きましょう!
まず、配列を使って行列に値を代入していきます。
int a[2][3]={{1,6,2},{3,6,3}};/*行列Aの値*/
int b[3][4]={{1,3,8,3},{2,3,5,7},{3,4,6,4}};/*行列Bの値*/
int seki[2][4]={0};/*積の要素を0で初期化*/
このように、整数型で二次元配列の中に値を入れていきます。
積を代入する変数を「seki」としておきます!
続いて、積で計算した値を行列に入れていきます。
for(i=0;i<2;i++){ /*積の値を代入していく*/
for(t=0;t<4;t++){
for(s=0;s<3;s++){
seki[i][t]=seki[i][t]+(a[i][s]*b[s][t]);
}
}
}
ここで、繰り返し処理の「for文」を3重構造にすることで積を計算できるようにします。
まずは、1行1列目の計算をみていきましょう。
a*a+b*b+c*cを計算すれば積を洗わせます。
「for文」の内側「s」に行列Aの列の要素3を入れることで、0(aの位置)→1(bの位置)→2(cの位置)と数値が変わっていきます。
また、行列Bの行の要素も同じように変化していきます。
次は、1行2列目を計算していきます。
行列Aの行は1行目で変わりませんが、行列Bの列は隣の2列目が計算に使います。
このように行列を1行3列目、1行4列目、2行1列目、、、と順に計算します。
そのため「for文」の真ん中「t」に行列Bの列の要素4を入れれば良いことがわかります。
最後に、「for文」の外側「i」に行列Aの列の要素2を入れることで積の計算が実現されます!
残りは、配列を画面に表示させるコードを書いていきます。
printf("行列 A =\n");/*行列Aを表示*/
for(i=0;i<2;i++){
for(t=0;t<3;t++){
printf("%d ",a[i][t]);
}
printf("\n");
}
printf("行列 B =\n");/*行列Bを表示*/
for(i=0;i<3;i++){
for(t=0;t<4;t++){
printf("%d ",b[i][t]);
}
printf("\n");
}
printf("行列の積(A*B) =\n");/*積を表示*/
for(i=0;i<2;i++){
for(t=0;t<4;t++){
printf("%d ",seki[i][t]);
}
printf("\n");
}
「for文」を使って行列を一つずつ表示させていきます。
その3:まとめて完成!
最後にこれまで書いてきたコードをまとめて、変数名を宣言する部分を付け足しながら完成させましょう♪
/*行列Aと行列Bの積を出すプログラム*/
#include <stdio.h>
int main(void) {
int a[2][3]={{1,6,2},{3,6,3}};/*行列Aの値*/
int b[3][4]={{1,3,8,3},{2,3,5,7},{3,4,6,4}};/*行列Bの値*/
int seki[2][4]={0};/*積の要素を0で初期化*/
int i,t,s;
for(i=0;i<2;i++){ /*積の値を代入していく*/
for(t=0;t<4;t++){
for(s=0;s<3;s++){
seki[i][t]=seki[i][t]+(a[i][s]*b[s][t]);
}
}
}
printf("行列 A =\n");/*行列Aを表示*/
for(i=0;i<2;i++){
for(t=0;t<3;t++){
printf("%d ",a[i][t]);
}
printf("\n");
}
printf("行列 B =\n");/*行列Bを表示*/
for(i=0;i<3;i++){
for(t=0;t<4;t++){
printf("%d ",b[i][t]);
}
printf("\n");
}
printf("行列の積(A*B) =\n");/*積を表示*/
for(i=0;i<2;i++){
for(t=0;t<4;t++){
printf("%d ",seki[i][t]);
}
printf("\n");
}
return 0;
}
最後に実行結果を表示させます。
うまく計算できていますね♪
まとめ
行列の積の計算を行いました!
今回は2*4列をしましたが、変数の値を変えれば他の大きさの行列も計算できますので、気になる方はぜひ試してみてください。