前提・実現したいこと
c++で逆行列を計算するプログラムを作成しています。
c言語初心者です。
発生している問題・エラーメッセージ
C[3][2]の値をprintfで表示すると正しく表示されません。
for文の使い方がわからず、とても見にくいプログラムになっています。申し訳ありません。
該当のソースコード
C++
1 2 3#include<stdio.h> 4int main(void){ 5 6double A[4][4], D[4][4], C[4][4]; 7 8 for (i = 0;i < 4;i++) { 9 for (j = 0;j < 4;j++) { 10 printf("A[%d][%d]=\t", i + 1, j + 1); 11 scanf_s("%lf", &A[i][j]); 12 /*printf("%lf\n", A[i][j]);*/ 13 } 14 } 15 16 printf("入力された行列は\n"); 17 printf("%lf\t%lf\t%lf\t%lf\n", A[0][0], A[0][1], A[0][2], A[0][3]); 18 printf("%lf\t%lf\t%lf\t%lf\n", A[1][0], A[1][1], A[1][2], A[1][3]); 19 printf("%lf\t%lf\t%lf\t%lf\n", A[2][0], A[2][1], A[2][2], A[2][3]); 20 printf("%lf\t%lf\t%lf\t%lf\n", A[3][0], A[3][1], A[3][2], A[3][3]); 21 22 double b,b1,b2,b3,b4; 23 24 b1 = A[0][0] * (A[1][1] * A[2][2] * A[3][3] + A[2][1] * A[3][2] * A[1][3] + A[3][1] * A[1][2] * A[2][3] - A[1][3] * A[2][2] * A[3][1] - A[2][1] * A[1][2] * A[3][3] - A[1][1] * A[2][3] * A[3][2]); 25 b2 = A[1][0] * (A[0][1] * A[2][2] * A[3][3] + A[2][1] * A[3][2] * A[0][3] + A[3][1] * A[0][2] * A[2][3] - A[0][3] * A[2][2] * A[3][1] - A[2][1] * A[0][2] * A[3][3] - A[0][1] * A[2][3] * A[3][2]); 26 b3 = A[2][0] * (A[0][1] * A[1][2] * A[3][3] + A[1][1] * A[3][2] * A[0][3] + A[3][1] * A[0][2] * A[1][3] - A[0][3] * A[1][2] * A[3][1] - A[1][1] * A[0][2] * A[3][3] - A[0][1] * A[1][3] * A[3][2]); 27 b4 = A[3][0] * (A[0][1] * A[1][2] * A[2][3] + A[1][1] * A[2][2] * A[0][3] + A[2][1] * A[0][2] * A[1][3] - A[0][3] * A[1][2] * A[2][1] - A[1][1] * A[0][2] * A[2][3] - A[0][1] * A[1][3] * A[2][2]); 28 b =1/( b1 - b2 + b3 - b4); 29 /*printf("%lf\n", b);*/ 30 31 if (b1-b2+b3-b4 == 0) { 32 printf("逆行列は存在しません\n"); 33 } 34 35 else { 36 C[0][0] = b * (A[1][1] * A[2][2] * A[3][3] + A[2][1] * A[3][2] * A[1][3] + A[3][1] * A[1][2] * A[2][3] - A[1][3] * A[2][2] * A[3][1] - A[2][1] * A[1][2] * A[3][3] - A[1][1] * A[2][3] * A[3][2]); 37 C[1][0] = (-1)*b * (A[1][0] * A[2][2] * A[3][3] + A[3][2] * A[2][0] * A[1][3] + A[3][0] * A[1][2] * A[2][3] -A[1][3] * A[2][2] * A[3][0] - A[3][2] * A[2][3] * A[1][0] - A[2][0] * A[1][2] * A[3][3]); 38 C[2][0]= b * (A[1][0] * A[2][1] * A[3][3] + A[3][1] * A[2][0] * A[1][3] + A[3][0] * A[1][1] * A[2][3] - A[1][3] * A[2][1] * A[3][0] - A[3][1] * A[2][3] * A[1][0] - A[2][0] * A[1][1] * A[3][3]); 39 C[3][0]=(-1)*b * (A[1][0] * A[2][1] * A[3][2] + A[3][1] * A[2][0] * A[1][2] + A[3][0] * A[1][1] * A[2][2] - A[1][2] * A[2][1] * A[3][0] - A[3][1] * A[2][2] * A[1][0] - A[2][0] * A[1][1] * A[3][2]); 40 C[0][1] = (-1)*b*(A[0][1] * A[2][2] * A[3][3] + A[2][1] * A[3][2] * A[0][3] + A[3][1] * A[0][2] * A[2][3] - A[0][3] * A[2][2] * A[3][1] - A[2][1] * A[0][2] * A[3][3] - A[0][1] * A[2][3] * A[3][2]); 41 C[1][1]= b * (A[0][0] * A[2][2] * A[3][3] + A[2][0] * A[3][2] * A[0][3] + A[3][0] * A[0][2] * A[2][3] - A[0][3] * A[2][2] * A[3][0] - A[2][0] * A[0][2] * A[3][3] - A[0][0] * A[2][3] * A[3][2]); 42 C[2][1]=(-1)* b * (A[0][0] * A[2][1] * A[3][3] + A[2][0] * A[3][1] * A[0][3] + A[3][0] * A[0][1] * A[2][3] - A[0][3] * A[2][1] * A[3][0] - A[2][0] * A[0][1] * A[3][3] - A[0][0] * A[2][3] * A[3][1]); 43 C[3][1]= b * (A[0][0] * A[2][2] * A[3][2] + A[2][0] * A[3][2] * A[0][2] + A[3][0] * A[0][2] * A[2][2] - A[0][2] * A[2][2] * A[3][0] - A[2][0] * A[0][2] * A[3][2] - A[0][0] * A[2][2] * A[3][2]); 44 C[0][2] = b * (A[0][1] * A[1][2] * A[3][3] + A[1][1] * A[3][2] * A[0][3] + A[3][1] * A[0][2] * A[1][3] - A[0][3] * A[1][2] * A[3][1] - A[1][1] * A[0][2] * A[3][3] - A[0][1] * A[1][3] * A[3][2]); 45 C[1][2]=(-1) *b * (A[0][1] * A[1][2] * A[3][3] + A[1][0] * A[3][2] * A[0][3] + A[3][0] * A[0][2] * A[1][3] - A[0][3] * A[1][2] * A[3][0] - A[1][0] * A[0][2] * A[3][3] - A[0][0] * A[1][3] * A[3][2]); 46 C[2][2]= b * (A[0][1] * A[1][1] * A[3][3] + A[1][0] * A[3][1] * A[0][3] + A[3][0] * A[0][1] * A[1][3] - A[0][3] * A[1][1] * A[3][0] - A[1][0] * A[0][1] * A[3][3] - A[0][0] * A[1][3] * A[3][1]); 47 C[3][2]=(-1)* b * (A[0][0] * A[2][1] * A[3][3] + A[0][3] * A[3][1] * A[2][0] + A[3][0] * A[0][1] * A[2][3] - A[0][3] * A[2][1] * A[3][0] - A[2][0] * A[0][1] * A[3][3] - A[0][0] * A[2][3] * A[3][1]); 48 C[0][3]=(-1)*b*(A[0][1] * A[1][2] * A[2][3] + A[1][1] * A[2][2] * A[0][3] + A[2][1] * A[0][2] * A[1][3] - A[0][3] * A[1][2] * A[2][1] - A[1][1] * A[0][2] * A[2][3] - A[0][1] * A[1][3] * A[2][2]); 49 C[1][3]= b * (A[0][0] * A[1][2] * A[2][3] + A[1][0] * A[2][2] * A[0][3] + A[2][0] * A[0][2] * A[1][3] - A[0][3] * A[1][2] * A[2][0] - A[1][0] * A[0][2] * A[2][3] - A[0][0] * A[1][3] * A[2][2]); 50 C[2][3]=(-1)*b * (A[0][0] * A[1][1] * A[2][3] + A[1][0] * A[2][1] * A[0][3] + A[2][0] * A[0][1] * A[1][3] - A[0][3] * A[1][1] * A[2][0] - A[1][0] * A[0][1] * A[2][3] - A[0][0] * A[1][3] * A[2][1]); 51 C[3][3]= b * (A[0][0] * A[1][1] * A[2][2] + A[1][0] * A[2][1] * A[0][2] + A[2][0] * A[0][1] * A[1][2] - A[0][2] * A[1][1] * A[2][0] - A[1][0] * A[0][1] * A[2][2] - A[0][0] * A[1][2] * A[2][1]); 52 53 printf("%lf\n", C[3][2]); 54 55 for (i = 0; i< 4; i++) { 56 for (j = 0; j < 4; j++) { 57 D[i][j] = A[i][j] * C[i][j]; 58 59 for (i = 0; i < 4; i++) { 60 for (j = 0; j < 4; j++) { 61 num = 0; 62 for (k = 0; k <4; k++) 63 num = num + A[i][k] * C[k][j]; 64 D[i][j] = num; 65 } 66 } 67 } 68 } 69 70 if (D[0][0] && D[1][1] && D[2][2] && D[3][3] == 1 && D[0][1] && D[0][2] && D[0][3] && D[1][0] && D[1][2] && D[1][3] && D[2][1] && D[2][0] && D[2][3] && D[3][0] && D[3][1] && D[3][2] && D[3][2] == 0) 71 { 72 printf("逆行列は存在しません\n"); 73 } 74 75 else { 76 printf("逆行列は\n"); 77 printf("%lf\t%lf\t%lf\n", C[0][0], C[0][1], C[0][2], C[0][3]); 78 printf("%lf\t%lf\t%lf\n", C[1][0], C[1][1], C[1][2], C[1][3]); 79 printf("%lf\t%lf\t%lf\n", C[2][0], C[2][1], C[2][2], C[2][3]); 80 printf("%lf\t%lf\t%lf\n", C[3][0], C[3][1], C[3][2], C[3][3]); 81 } 82 } 83 } 84 85 return 0; 86 87}
試したこと
printf("%lf\n",C[3][2]);の時点では正しく表示されました。
その後、逆行列の存在証明を行ったあと表示すると0になってしまいました。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
その表示が0になったときの変数の内容はどうだったんでしょうか
すみません、変数というのは、C[3][2]の値のことですか?
どこのprintfの話かわかりませんが、出力させたい変数の実際の値を知りたいです
試しに実行した時は A00=1 A01=1 A02=1 A03=-1 A10=1 A11=1 A12=-1 A13=1 A20=1 A21=-1 A22=1 A23=1 A30=-1 A31=1 A32=1 A33=1 を入力したとき C32=0.25となるはずなのですが 0と表示されます。
こうなるはず、の話じゃなく、実際に0が出力されるときの、実際のC32の値のはなしをしたいんですが。
最後に逆行列を表示する直前まで 0.25が入力されています。
それはわかったけど、printfの実行のときはなにが入ってるのかと。
回答1件
あなたの回答
tips
プレビュー