
2行2列を5乗させるプログラムを作って、一応できたつもりだったんですが結果が合いません・・・
何かヒントでもいいのでわかる方いらっしゃいましたらよろしくお願いします。
<プログラム>
#include <stdio.h>
#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<N; i++)
{
for( j=0; j<N; j++)
{
printf("A[%d][%d]=", i+1, j+1);
scanf("%d", &A[i][j]);
}
}
for(i=0; i<N; i++)/* A_NEW=A*Aの計算 */
{
for(j=0; j<N; j++)
{
for(k=0; k<N; k++)
{
A_NEW[i][j] += A[i][k] * A[k][j];
}
}
}
for(l=0; l<3; l++)
{
for(i=0; i<N; i++)/* A_5の計算 */
{
for(j=0; j<N; j++)
{
for(k=0; k<N; k++)
{
A_5[i][j] += A_NEW[i][k] * A[k][j];
}
}
}
for(i=0; i<N; i++)
{
for(j=0; j<N; j++)
{
A_NEW[i][j] = A_5[i][j];
}
}
}
printf("A_5=\n"); /* 出力 */
for( i=0; i<N; i++)
{
for( j=0; j<N; j++)
{
printf("%d ", A_5[i][j]);
}
printf("\n");
}
}
<入力例>
A=
1 3
2 1
<期待する結果>
A=
241 303
202 241
<このプログラムの結果>
406 498
332 406
No.2ベストアンサー
- 回答日時:
#include <stdio.h>
#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<N; i++)
{
for( j=0; j<N; j++)
{
printf("A[%d][%d]=", i+1, j+1);
scanf("%d", &A[i][j]);
}
}
for(i=0; i<N; i++) /* A_NEW=A*Aの計算 */
{
for(j=0; j<N; j++)
{
for(k=0; k<N; k++)
{
A_NEW[i][j] += A[i][k] * A[k][j];
}
}
}
for(l=0; l<3; l++)
{
for(i=0; i<N; i++) /* A_5の計算 */
{
for(j=0; j<N; j++)
{
for(k=0; k<N; k++)
{
A_5[i][j] += A_NEW[i][k] * A[k][j]; /* …P */
}
}
}
for(i=0; i<N; i++)
{
for(j=0; j<N; j++)
{
A_NEW[i][j] = A_5[i][j];
}
}
/* 一端0に戻さないと残存している結果にPを足されることになる …Q*/
for(i=0; i<N; i++)
{
for(j=0; j<N; j++)
{
A_5[i][j] = 0;
}
}
}
printf("A_5=\n"); /* 出力 */
for( i=0; i<N; i++)
{
for( j=0; j<N; j++)
{
printf("%d ", A_NEW[i][j]); /* Qで0に戻しちゃったので出力結果の変数が変わっています。*/
}
printf("\n");
}
}
/*
ただ,個人的には,二つの行列を計算するだけの関数を分けて
mainから5回呼び出した方が綺麗だと思う
面倒なので書かないけど,ここまで自力でコード書く人なら
これだけできちんと書けるだけの人なはず。頑張ってね!
*/
No.3
- 回答日時:
他の方が指摘をされているので,サンプル書いてみました.
------
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に向かう前に,紙に式などを書いてみると返って早く完成しますよ.
なるほどー
こっちの方がシンプルですね!
わかりやすく書いていただきありがとうございます!
一応先に紙に書いてから作ってるんですが、まだ勉強し始めて
1週間ちょっとなのでまだまだ完成に至るまでには甘いです・・・
No.1
- 回答日時:
デバッガを使って 変数の値を追いかけましょう
for(i=0; i<N; i++) /* A_NEW=A*Aの計算 */
{
for(j=0; j<N; j++)
{
for(k=0; k<N; k++)
{
A_NEW[i][j] += A[i][k] * A[k][j];
}
}
}
のループの中で A_NEW[i][j]の期待する値と実際の値を比べて見ましょう
+= で代入 & 加算をしているので kのループに入る前のA_NEW[i][j]の値はどうなっているのが正常なのでしょう
ご意見ありがとうございます。
ただ、まだデバッガの使い方を習っていないのでわからないです・・・
代わりにprintfで逐次調べてみます!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
【最大10000ポイント当たる!!】dポイント・Amazonギフト券・マイルなど色々交換できるgooポイントが【質問投稿】で当たる!!
教えて!goo 質問投稿キャンペーン
-
c言語 行列のn階乗のプログラム
数学
-
n行n列の行列の2乗
Java
-
C言語、行列の積を求めるプログラムについて
C言語・C++・C#
-
4
行列の表示
Java
-
5
フィボナッチ数列 プログラミング C言語
C言語・C++・C#
-
6
C言語初心者の質問失礼します。
C言語・C++・C#
-
7
数字の位ごとの値を表示するプログラム
C言語・C++・C#
-
8
Java、2の0乗~10乗の表示
Java
-
9
双子の素数
C言語・C++・C#
-
10
方程式を2分法を用いて解くプログラム
C言語・C++・C#
-
11
Cで3乗根を求める方法
C言語・C++・C#
-
12
数字文字の出現回数を表示するプログラム(C言語)
C言語・C++・C#
-
13
C言語でのフィボナッチ数列の表示
C言語・C++・C#
-
14
C言語 配列の長さの上限
C言語・C++・C#
-
15
整数aを入力し、aの2乗、3乗、4乗を計算して、次のように表示するプロ
C言語・C++・C#
-
16
アルファベットの出現頻度求めるプログラム
C言語・C++・C#
-
17
C言語で連立一次方程式
C言語・C++・C#
-
18
Javaを使った行列計算
Java
-
19
エレキギターのピックアップの位置による音質の違い
その他(趣味・アウトドア・車)
-
20
C言語の複素数についてです。
C言語・C++・C#
関連するQ&A
- 1 行列A(l行m列)と行列B(m行n列)の積C(l行n列)を求めるプログラム
- 2 行列内の行の交換,列の交換をするプログラム
- 3 C言語で、べき乗の計算方法について質問です。 a= b^(3/2) bの「3分の2乗」の計算ってどう
- 4 機械学習や画像処理でのプログラムでは行列などが使われていますが行列をまったく使わなくても処理を可能な
- 5 C言語で、べき乗の計算をするプログラムについてです
- 6 H8 3052 のプログラムで、少数のべき乗計算
- 7 一定時間ごとにプログラムを起動させるプログラムを作りたい
- 8 特定のプログラムを自動的に起動させるプログラムって何で作れるのでしょうか?
- 9 分数の足し算をさせるプログラムが分かりません。どなたか分かりませんか?
- 10 待ち行列シュミレーションのプログラム
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
人気Q&Aランキング
-
4
powf を使わずにべき乗を計算
-
5
C言語 log実装
-
6
CRC8を教えてください
-
7
double型からfloat型への型変換...
-
8
ガウス積分について
-
9
数値を入力して1からその数値ま...
-
10
経過日数を調べたい
-
11
C# 計算処理中に実行中ウィン...
-
12
2の累乗を計算するプログラム...
-
13
ユーザ時間とシステム時間の違...
-
14
Visual C++でdebugとreleaseで...
-
15
色の判定
-
16
C言語のプログラムで質問です。
-
17
C言語で電卓を作成する。
-
18
移動平均を計算するプログラム
-
19
エクセルVBAで機械の稼働時間を...
-
20
char gyou[1024];でcharの表現...
おすすめ情報