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

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

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

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

バッチファイル

バッチファイル(Batch File)は、Windowsのコマンドラインインタープリターによって複数のコマンドを実行させる事が出来るスクリプトファイルです。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

1935閲覧

ファイルから読み取った5×5行列の行列式を計算したい

bacca

総合スコア1

C

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

バッチファイル

バッチファイル(Batch File)は、Windowsのコマンドラインインタープリターによって複数のコマンドを実行させる事が出来るスクリプトファイルです。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2021/08/21 03:57

編集2021/08/21 05:23

前提・実現したいこと

C言語でmatrix,datというテキストファイルで与えられた5×5行列の行列式を計算しようとしています。
ファイルから行列を読みとり配列に格納しましたが、
その後三角行列を作成し対角部分の積を計算したさいに計算結果が合いません。
どの部分がおかしいのでしょうか?
正しい答えは9262です。

該当のソースコード

C言語 #include<stdio.h> #include<math.h> #include <stdlib.h> int main(void){ int matrix[5][5] ; int det=1,x; int n=5; int a,i,j,k; FILE *fp; fp=fopen("matrix.dat","r"); if(fp==NULL){ puts("matrix.datは開けません"); } for(a=0;a<5;a++){ fscanf(fp,"%d %d %d %d %d",&matrix[a][0],&matrix[a][1],&matrix[a][2],&matrix[a][3],&matrix[a][4]); printf("%d,%d,%d,%d,%d\n",matrix[a][0],matrix[a][1],matrix[a][2],matrix[a][3],matrix[a][4]); } for(i=0;i<n;i++){ for(j=0;j<n;j++){ if(i<j){ x=matrix[j][i]/matrix[i][i]; for(k=0;k<n;k++){ matrix[j][k]=matrix[j][k]-matrix[i][k]*x; } } } } for(i=0;i<n;i++){ det=det*matrix[i][i]; } printf("%d ",det); fclose(fp); return 0; } -------------------------------

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

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

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

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

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

guest

回答2

0

ベストアンサー

こちらに似たサンプルがありました。確認したところ int でなく double が使われているようですね。

■ 行列式の値の求め方、逆行列の作り方の C 言語プログラム
https://thira.plavox.info/blog/2008/06/_c.html

c

1#include<stdio.h> 2#include<math.h> 3#include <stdlib.h> 4 5int main(void) { 6 double matrix[5][5]; 7 double det = 1, x; 8 int n = 5; 9 int a, i, j, k; 10 FILE * fp; 11 12 13 fp = fopen("matrix.dat", "r"); 14 15 if (fp == NULL) { 16 puts("matrix.datは開けません"); 17 } 18 19 for (a = 0; a < 5; a++) { 20 fscanf(fp, "%lf %lf %lf %lf %lf", &matrix[a][0], &matrix[a][1], &matrix[a][2], &matrix[a][3], &matrix[a][4]); 21 printf("%f,%f,%f,%f,%f\n", matrix[a][0], matrix[a][1], matrix[a][2], matrix[a][3], matrix[a][4]); 22 } 23 24 25 for (i = 0; i < n; i++) { 26 for (j = 0; j < n; j++) { 27 if (i < j) { 28 x = matrix[j][i] / matrix[i][i]; 29 for (k = 0; k < n; k++) { 30 matrix[j][k] = matrix[j][k] - matrix[i][k] * x; 31 } 32 } 33 } 34 } 35 36 37 for (i = 0; i < n; i++) { 38 det = det * matrix[i][i]; 39 } 40 printf("%lf ", det); 41 fclose(fp); 42 return 0; 43}

以下、実行結果です。

5.000000,0.000000,2.000000,8.000000,-1.000000 -3.000000,9.000000,10.000000,0.000000,0.000000 -7.000000,1.000000,1.000000,0.000000,2.000000 0.000000,9.000000,7.000000,-1.000000,5.000000 2.000000,-2.000000,3.000000,8.000000,0.000000 9262.000000

投稿2021/08/21 04:40

cx20

総合スコア4648

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

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

bacca

2021/08/21 04:49

わざわざ、確認までありがとうございます。 今回は型をintではなくdoubleにするだけで解決するという認識でいいのでしょうか?
cx20

2021/08/21 05:55 編集

そうですね。int同士の除算は小数点以下が切り捨てられる為、誤った計算結果になっていたと思われます。
bacca

2021/08/21 05:55

ありがとうございました!
guest

0

0含まれてたら、結果は0ですやん

投稿2021/08/21 04:35

y_waiwai

総合スコア88042

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

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

bacca

2021/08/21 04:38

それは行列に0がふくまれていたら、行列式が0になるということですか? 今回の場合手計算しても行列式が9262になったのですが
y_waiwai

2021/08/21 04:41

最後の計算する前に、matrixのナカミ全部プリントしてみたらどうですか。
bacca

2021/08/21 04:45 編集

matrixをプリントすると与えられた物と一致します しかし、行列式だけが一致しないので、その部分がなぜなのか分からないんです
episteme

2021/08/21 05:53 編集

> 0含まれてたら、結果は0ですやん なんで? 単位行列Eの行列式は0なの? 逆行列つくれないの?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問