質問: 行列をべき乗させるプログラム 2行2列を5乗させるプログラムを作って、一応できたつもりだったんですが結果が合いません・・・ 何かヒントでもいいのでわかる方いらっしゃいましたらよろしくお願いします。 <プログラム> #include #define n 2 int a[n][n]; int a_new[n][n]; int a_5[n][n]; /* 行列aを5乗したもの */ int main() { int i,j,k,l; /* 2行2列の係数行列aの成分を入力 */ printf("係数行列aを%d行%d列で入力してください\n", n, n); for( i=0; i a= 1 3 2 1 <期待する結果> a= 241 303 202 241 <このプログラムの結果> 406 498 332 406
回答: 他の方が指摘をされているので,サンプル書いてみました. ------ int a[n][n] = {{1,3},{2,1}};//入力 int r[n][n] = {{1,0},{0,1}};//出力 単位行列で初期化 int i, j, k,l; for(l = 0; l < 5; l++){ //i行目の処理 for (i = 0; i < n; i++) { //i行目をtに記憶 int t[n]; for (k = 0; k < n; k++) t[k] = r[i][k]; //i行目の計算 for (j = 0; j < n; j++) { //i行j列目を計算 int tmp = 0; for (k = 0; k < n; k++) tmp += t[k] * a[k][j]; r[i][j] = tmp; } } } ------ r = r * a 積の計算では,rのi行目の計算を始める前にまず,i行目を記憶. 記憶したi行目とaのi列目を計算してrのi行目へ記憶としています. こうすることで,rとaだけで計算を進めることができます. 5乗の計算は,入力としてr,a(入力)を取り,出力としてrを出力するようにしてみました. rの初期値を r = e(eは単位行列) として r = r * a を5回まわしています. 一回目は,r = e * a = a,2回目は r = r * a = aの2乗となっていきます. 定式化(設計)をきっちりとせずにコーディングに移ると,その場で作った曖昧な処理がうまく働かないことが多いので pcに向かう前に,紙に式などを書いてみると返って早く完成しますよ.