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

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

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

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

OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

6813閲覧

逆行列と行列の積。。。

windowsaa

総合スコア16

C

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

OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2017/10/15 18:16

編集2017/10/16 01:21

このプログラムはayの逆行列を求めたのちその逆行列とR₀の行列を掛け算したいと考えていますがうまくいきません

アドバイスお願いします。

C

1 2#include <stdlib.h> 3#include<iostream> 4#include<cmath> 5 6 7void Inversematrix(double a[4][4]); 8void matrixmultiplication(double x[4][2], double y[4][4], double xy[4][2]); 9double inv_a[4][4]; 10 11int main(int argc, char **argv) 12{ 13 14 double t[4] = { 0.0,0.2,0.6,1.0 }, R₀[4][2] = { { 1,2 },{ 2,3 },{ 3,1 },{ 5,1 } }; 15 double R₀ay[4][2]; 16 double ay[4][4] = { { pow((1 - t[0]), 3), 3 * pow((1 - t[0]), 2)*t[0], 3 * (1 - t[0])*pow(t[0], 2), pow(t[0], 3)}, 17 { pow((1 - t[1]), 3), 3 * pow((1 - t[1]), 2)*t[1], 3 * (1 - t[1])*pow(t[1], 2), pow(t[1], 3)}, 18 { pow((1 - t[2]), 3), 3 * pow((1 - t[2]), 2)*t[2], 3 * (1 - t[2])*pow(t[2], 2), pow(t[2], 3)}, 19 { pow((1 - t[3]), 3), 3 * pow((1 - t[3]), 2)*t[3], 3 * (1 - t[3])*pow(t[3], 2), pow(t[3], 3)}}; //入力用の配列(R₀のxの値を代入 20 21    Inversematrix(ay); 22      23      matrixmultiplication(R₀,ay,R₀ay); 24 25 return 0; 26} 27 28void Inversematrix(double a[4][4]) 29{ 30 double inv_a[4][4],t[4],R₀[2][2]; //ここに逆行列が入る 31 double buf; //一時的なデータを蓄える 32 int i, j, k; //カウンタ 33 int n = 4; 34 35 //単位行列を作る 36 for (i = 0; i < n; i++) { 37 for (j = 0; j < n; j++) { 38 inv_a[i][j] = (i == j) ? 1.0 : 0.0; 39 } 40 } 41 42 //掃き出し法 43 for (i = 0; i < n; i++) { 44 buf = 1 / a[i][i]; 45 for (j = 0; j < n; j++) { 46 a[i][j] *= buf; 47 inv_a[i][j] *= buf; 48 } 49 for (j = 0; j < n; j++) { 50 if (i != j) { 51 buf = a[j][i]; 52 for (k = 0; k < n; k++) { 53 a[j][k] -= a[i][k] * buf; 54 inv_a[j][k] -= inv_a[i][k] * buf; 55 } 56 } 57 } 58 } 59 //逆行列を出力 60 for (i = 0; i < n; i++) { 61 for (j = 0; j < n; j++) { 62 printf(" %f", inv_a[i][j]); 63 } 64 printf("\n"); 65 } 66 67} 68 69void matrixmultiplication(double x[4][2],double y[4][4], double xy[4][2]) 70{ 71 72 73 int i, j, k; 74 75 for (i = 0; i < 4; i++) { 76 for (j = 0; j < 2; j++) { 77 xy[i][j] = 0; 78 for (k = 0; k < 4; k++) { 79 xy[i][j] += x[i][k] * y[k][j]; 80 } 81 } 82 } 83 84 for (i = 0; i < 4; i++) { 85 for (j = 0; j < 2; j++) { 86 printf("%4d", xy[i][j]); 87 } 88 putchar('\n'); 89 } 90}

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

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

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

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

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

showkit

2017/10/16 00:38

まず1点、<iostream> を使用しているのでこれは C でなく C++ と思われます。2点目、 double R₀ay[4][2]; は文字化けしています。このままではその点のみでも コンパイルエラーになるかと思われます。同じような 化け文字になる個所が多数みられます。
guest

回答2

0

ベストアンサー

こんにちは。

取り敢えずやってみました。最後の出力の単純ミスでは?
double型に対して%d(int型)の書式指定を使っているから、数値が化けます。

なお、20行付近のインデントで、全角スペースを使ってます。gccの場合、全角スペースは""の中くらいしか使えません。(Visual C++はもしかすると関数名等に使えるかも知れません。でも全角スペースは使うべきでないでしょう。)

投稿2017/10/16 01:38

Chironian

総合スコア23272

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

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

0

既に、ご自分でお気づきかも知れませんが・・・

自分が行列プログラミングする際には次のようにする習慣です。

  1. M行N列の行列はdouble matrix[M][N]のような形(最初の次元を行)とする
  2. A x Bの計算をする関数の引数はAを先にBを後にする

質問者さんのコードでは上の規則がどうなっているのかパっと見てわかりませんでした。つまり自分の場合、「2行4列 x 4行4列 => 2行4列」という計算をするなら、以下をイメージするのです。

void matrixmultiplication(double x[2][4], double y[4][4], double xy[2][4])

質問者さんのコードでは以下のようになっているため、「何行何列の行列のどういう順番の積なのか?」がよくわかりませんでした。

void matrixmultiplication(double x[4][2], double y[4][4], double xy[4][2])

質問者さんご自身も上記を充分明確にできないままプログラミングされているかも知れないと思いました。単なるうっかりかも知れませんが、配列の範囲外アクセスをしてしまってます。

投稿2017/10/16 23:29

KSwordOfHaste

総合スコア18392

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問