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

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

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

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

Q&A

1回答

642閲覧

行列をinverseしたい。そして、inverseされた行列と、単位行列に分ける

alizona

総合スコア126

C

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

0グッド

0クリップ

投稿2021/10/28 08:09

編集2021/11/04 17:53

行列Mをinverseしたいです。また、単位行列を作りリターンします。
行列をinverseする中でスードコードが提供されています。
しかし、自分で書き足さないといけないところがあり、そこのコードがかけずにinverseができません。

プログラミング言語C++ 第4版 5章、練習問題からです。

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

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

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

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

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

WoodenHamlet

2021/10/28 08:26

コードが書けないというのは、どれほどのレベルで書けないのでしょうか?①全く想像もつかず、なにもわからない②コードを書いたが、エラーが発生しコンパイルが通らない③コンパイルは通ったが、所望の動作をしない/あなたがどのようなことをして、どうなると思って、結果どうなったということを追記されると、アドヴァイスする人も出るかと思います
episteme

2021/10/28 08:32

説枚不足。Nってなんですか?
alizona

2021/10/28 08:46

Nは、単位行列です。 コードはコンパイルされたのですが、inverseされたあとのデータが答えと一致しません。また単位行列Nの値も一致しません。
kaina

2021/10/28 11:28

本当にコンパイル出来たものを張り付けてますか? 省略した部分を考慮しても、以下の行はコンパイルエラーになると思われますが。 f= Mp][p];
guest

回答1

0

f= Mp][p];
これ、コンパイルエラーです。
#includemain も含むコンパイル可能なコードを提示してください。

次のコードは参考になりますか?

C

1#include <stdio.h> 2 3#define n 3 4 5void inverse(double M[n][n], double N[n][n]) 6{ 7 for (int p = 0; p < n; p++) { 8 double f = M[p][p]; 9 for (int i = 0; i < n; i++) { 10 M[p][i] /= f; 11 N[p][i] /= f; 12 } 13 for (int i = 0; i < n; i++) { 14 if (p != i) { 15 double f = M[i][p]; 16 for (int k = 0; k < n; k++) { 17 M[i][k] -= M[p][k] * f; 18 N[i][k] -= N[p][k] * f; 19 } 20 } 21 } 22 } 23} 24 25void print(double a[n][n]) 26{ 27 for (int i = 0; i < n; i++) { 28 for (int j = 0; j < n; j++) printf(" %8.3f", a[i][j]); 29 putchar('\n'); 30 } 31} 32 33int main(void) 34{ 35 double M[3][3] = { 36 { 1, 1, -1 }, 37 { -2, 0, 1 }, 38 { 0, 2, 1 }, 39 }; 40 double N[3][3] = { 41 { 1, 0, 0 }, 42 { 0, 1, 0 }, 43 { 0, 0, 1 }, 44 }; 45 inverse(M, N); 46 puts("逆行列"); 47 print(N); 48 puts("単位行列"); 49 print(M); 50}

実行結果

text

1逆行列 2 -0.500 -0.750 0.250 3 0.500 0.250 0.250 4 -1.000 -0.500 0.500 5単位行列 6 1.000 0.000 0.000 7 0.000 1.000 0.000 8 0.000 0.000 1.000

double f = M[p][p]; の f が 0 だと、割り算できません。
本当はその対策も必要です。

投稿2021/11/05 00:48

kazuma-s

総合スコア8224

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問