質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

1回答

720閲覧

C言語での行列積の計算プログラム

gadou

総合スコア1

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2023/04/28 03:27

編集2023/04/28 03:51

実現したいこと

正しい計算結果を得る

前提

C言語でdouble型n×nの行列2つの行列積を求めるプログラムを書いたのですが、nを2, 4, 8, と増やしたところ、n=4から計算結果が一部おかしくなってしまいます。
n=4では2回に1回、n=8は毎回おかしくなります。
なお、計算するn×nの行列2つは下記コードにてダミーデータを入れています。

for(i=0; i<N; i++){  for(j=0; j<N; j++){  A[i][j] = (double)i + j;  B[i][j] = (double)i + j;  }  }

発生している問題・エラーメッセージ

n=4の場合です。

14.000000, 20.000000, 26.000000, 32.000000,
20.000000, 30.000000, 40.000000, 50.000000,
26.000000, 40.000000, 54.000000, 68.000000,
32.000000, 50.000000, 68.000000, -421788892257061440000000000000000000000000000000000000000000000000000.000000,

該当のソースコード

#include <stdio.h> #define N 4 int main(int argc, char *argv[]){ double A[N][N], B[N][N], C[N][N]; int i, j, k; /*行列のダミーデータを入力*/ for(i=0; i<N; i++){ for(j=0; j<N; j++){ A[i][j] = (double)i + j; B[i][j] = (double)i + j; } } /*行列積の計算*/ for(i=0; i<N; i++){ for(j=0; j<N; j++){ for(k=0; k<N; k++){ C[i][j]=C[i][j]+(A[i][k]*B[k][j]); } } } /*行列を表示*/ printf("\n");printf("C\n"); for(i=0; i<N; i++){ for(j=0; j<N; j++){ printf("%f, ", C[i][j]); } printf("\n"); } printf("\n"); return 0; }

補足情報(FW/ツールのバージョンなど)

環境はVisual Studio Codeです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2023/04/28 03:41

このままではコードが読みづらいので、質問を編集し、</>(コードの挿入)ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
episteme

2023/04/28 03:42 編集

Visual Studio Codeは環境ではありません、エディタです。 環境 すなわち OS/コンパイラ はなんですか? # Windows11/Visual C++ では再現しませんでした
gadou

2023/04/28 03:59

OSはWindows 11です。コンパイラはきちんと把握できていないのですがおそらくgccです。
episteme

2023/04/28 04:03 編集

↑質問を編集(修正)してください。 > コンパイラはきちんと把握できていないのですがおそらくgccです ダメです。きちんと把握してください。
guest

回答1

0

ベストアンサー

c

1 C[i][j]=C[i][j]+(A[i][k]*B[k][j]);

C[i][j] が初期化されないまま参照されています。ダミーデータを入れるところか k のループの前で C[i][j] = 0; もやっておくといいのでは。

投稿2023/04/28 03:37

編集2023/04/28 04:03
int32_t

総合スコア20832

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

episteme

2023/04/28 03:55

C[N][N] の初期値がどうであろうが正しい結果を得たいでしょうから 「k のループの前で C[i][j] = 0;」が宜しかろうと。
int32_t

2023/04/28 04:02

ごもっともです。
gadou

2023/04/28 04:04

解決しました。迅速なご回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問