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

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

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

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

Q&A

解決済

1回答

15086閲覧

逆行列を求める関数を作りたい

h_proc

総合スコア68

C

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

0グッド

0クリップ

投稿2019/01/05 22:50

2次と3次との正方行列の逆行列を求める関数を作っています。2次と3次では、逆行列の求め方が異なるため、一つの関数でどちらも計算できるコードを作ることは難しいと思い、ひとまず、の逆行列を求める関数を作りました。しかし、aの絶対値が正しく認識されないようで、dt2[2][2]={{0,0},{0,0}}と表示されてしまいます。改善すべき点を教えていただきたいです。
やはり、3次は別に定義するしかないですか。

よろしくお願いいたします。

c

1#include <stdio.h> 2#include<stdlib.h> 3 4#define ARRAY_SIZE 2 5 6int gyaku(int dt1[2][2], int dt2[2][2]); 7 8int gyaku(int dt1[2][2], int dt2[2][2]) { 9 //二次の場合の逆行列 10 int a = 0; 11 int i, j = 0; 12 a = ((dt1[0][0] * dt1[1][1]) - (dt1[0][1] * dt1[1][0])); 13 int b = 0; 14 b = abs(a); 15 16 if (a = 0) { 17 printf("Error!\n"); 18 } 19 else { 20 for (i = 0; i < ARRAY_SIZE; i++) { 21 for (j = 0; j < ARRAY_SIZE; j++) { 22 23 dt2[i][j] = (dt1[i][j] / b); 24 } 25 } 26 } 27 28 return dt2[i][j]; 29} 30 31int main(void) { 32 int dt1[2][2] = { {2,4}, {5,6} }; 33 int dt2[2][2] = {0,0}; 34 35 gyaku(dt1, dt2); 36 37 for (int i = 0; i < ARRAY_SIZE; i++) { 38 for (int j = 0; j < ARRAY_SIZE; j++) { 39 printf("%2d", dt2[i][j]); 40 } 41 printf("\n"); 42 } 43} 44

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

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

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

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

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

guest

回答1

0

ベストアンサー

ちらっとみて
if (a = 0)
は if (a == 0) とか if (b <= delte) # delta は十分小さな値を設定しておく)
の間違いと思われます。

逆行列に関する参考情報

  • 行列式の値の求め方、逆行列の作り方の C 言語プログラム

http://thira.plavox.info/blog/2008/06/_c.html

...
逆行列の求め方
何といってもやはり掃き出し法が簡単。2 次から n 次まで対応
...

  • 逆行列を求める2通りの方法と例題

https://mathtrain.jp/inversematrix

...
2×2の場合は覚えるのみです
...
一般の n×n の正方行列の逆行列を求める二通りの方法を解説します
...
逆行列の求め方1:掃き出し法
...
逆行列の求め方2:余因子を用いる
...

投稿2019/01/05 23:45

katoy

総合スコア22324

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

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

h_proc

2019/01/06 02:48 編集

回答ありがとうございます。参考にして作ってみたのですが、nan,infが出てきてしまいます。どこが間違っているのでしょうか。 #include <stdio.h> #include<stdlib.h> #define ARRAY_SIZE 3 double gyaku(double dt1[ARRAY_SIZE][ARRAY_SIZE], double dt2[ARRAY_SIZE][ARRAY_SIZE]); double gyaku(double dt1[ARRAY_SIZE][ARRAY_SIZE], double dt2[ARRAY_SIZE][ARRAY_SIZE]) { //逆行列の計算 double a = 0; int i, j = 0; for (i = 0; i < ARRAY_SIZE; i++) { for (j = 0; j < ARRAY_SIZE; j++) { dt2[i][j] = (i == j) ? 1.0 : 0.0; } } for (i = 0; i < ARRAY_SIZE; i++) { a = 1 / dt1[i][i]; for (j = 0; j < ARRAY_SIZE; j++) { dt1[i][j] *= a; dt2[i][j] *= a; } for (j = 0; j < ARRAY_SIZE; j++) { if (i != j) { a = dt1[j][i]; for (int k = 0; k < ARRAY_SIZE; k++) { dt1[j][k] -= dt1[i][k] * a; dt2[j][k] -= dt2[i][k] * a; } } else { //NR } } } return dt2[ARRAY_SIZE][ARRAY_SIZE]; } int main(void) { double dt1[3][3] = { {1,2,4}, {5,6,8} }; double dt2[3][3] = {0,0,0}; gyaku(dt1, dt2); for (int i = 0; i < ARRAY_SIZE; i++) { for (int j = 0; j < ARRAY_SIZE; j++) { printf("%2f", dt2[i][j]); } printf("\n"); } }
episteme

2019/01/06 03:06 編集

double dt1[3][3] = { {1,2,4}, {5,6,8} }; だと3行目がないよ。マトモなコタエは得られんじゃろ。 おまけ: gyaku の戻り値は何を返したいのかしら? 返すもんがないなら void でええよ。
h_proc

2019/01/06 13:59

つまらないミスをしていました。解決しました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問