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

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

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

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

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

C++

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

Q&A

2回答

6118閲覧

C言語 上三角行列の出力

slushii

総合スコア19

C

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

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

C++

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

0グッド

0クリップ

投稿2018/10/17 09:12

編集2018/10/17 09:35

前提・実現したいこと

C言語で与えられた行列に対する上三角行列をを表示するプログラム作っています。
以下のプログラムでは結果が上手く表示されません。
誤っている個所を教えていただきたいです。

該当のソースコード

C

1#include<stdio.h> 2 3 int main(){ 4 int a[4][4]={{2,-1,6,3},{2,-2,4,2},{-1,3,-4,4},{3,-2,12,12}}; 5 int b[4][4]; 6 int buf, n=4, i,j,k; 7 8 for(i=0;i<n;i++){ 9 for(j=0;j<n;j++){ 10 if(i<j){ 11 buf=a[j][i]/a[i][i]; 12 for(k=0;k<n;k++){ 13 b[j][k]-=a[i][k]*buf; 14 } 15 } 16 } 17 } 18 19 for(i=0;i<n;++i){ 20 for(j=0;j<n;++j){ 21 printf("%d ",b[i][j]); 22 if(j==n-1) 23 printf("\n"); 24 } 25 } 26return 0; 27}

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

以下が現在の出力結果です 0 9052424 5651992 2 0 9052433 -6 21 18 9052426 9052452 2 16152324 1703764 1979215300 5651999

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

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

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

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

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

guest

回答2

0

要はLU分解っしょ? コレ↓の上三角成分を取り出せばいいんよね?

C++

1/* 2 N次正方行列AをLU分解する。 3 結果でAを上書きする。 4 */ 5 6template<typename T,size_t N> 7bool lu_factorize(T (&A)[N][N]) { 8 for ( int i = 0; i < N-1; ++i ) { 9 for ( int j = i+1; j < N; ++j ) { 10 if ( A[i][i] == T(0) ) { return false; } 11 A[j][i] /= A[i][i]; 12 for ( int k = i+1; k < N; ++k ) { 13 A[j][k] -= A[j][i] * A[i][k]; 14 } 15 } 16 } 17 return true; 18}

投稿2018/10/17 12:43

episteme

総合スコア16614

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

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

0

ガウスの消去法

アルゴリズムについては こちらのpdf がわかりやすいので参考にしてください。
ピボット選択は零割り防止の他、丸め誤差が大きくなる計算を防ぐ目的があります。 ピボット選択については、こちら を参考にしてください。

c

1 2#include <math.h> 3#include <stdio.h> 4 5#define n 4 6 7void print_matrix(double A[][n]) 8{ 9 for (int i = 0; i < n; ++i) { 10 for (int j = 0; j < n; ++j) 11 printf("%f ", A[i][j]); 12 printf("\n"); 13 } 14} 15 16int main() 17{ 18 // clang-format off 19 double A[4][4] = { 20 { 2, -1, 6, 3}, 21 { 2, -2, 4, 2}, 22 {-1, 3, -4, 4}, 23 { 3, -2, 12, 12}}; 24 // clang-format on 25 printf("original\n"); 26 print_matrix(A); 27 28 for (int i = 0; i < n; ++i) { 29 printf( 30 "step %d" 31 "\n----------------------------\n", 32 i); 33 34 // 1. <ピボット選択> k行i列の中で最大の要素を調べる。 35 // ---------------------------------- 36 double max_val = fabs(A[i][i]); 37 int max_row = i; 38 for (int row = i + 1; row < n; ++row) { 39 if (fabs(A[row][i]) > max_val) { 40 max_val = fabs(A[row][i]); 41 max_row = row; 42 } 43 } 44 45 // 2. <ピボット選択> 現在の行と値が最も大きい行を入れ替える。 46 // ---------------------------------- 47 if (i != max_row) { 48 for (int col = i; col < n; ++col) { 49 double tmp = A[max_row][col]; 50 A[max_row][col] = A[i][col]; 51 A[i][col] = tmp; 52 } 53 printf("swap rows: %d <--> %d\n", i, max_row); 54 print_matrix(A); 55 } 56 57 // 3. <前進消去> 58 // ---------------------------------- 59 for (int row = i + 1; row < n; ++row) { 60 double tmp = A[row][i] / A[i][i]; 61 printf("---> A[%d][%d] / A[%d][%d] = %f\n", row, i, i, i, tmp); 62 63 /* 第 i 行を -A[row][i] / A[i][i] 倍して、第 j 行に加える */ 64 A[row][i] = 0; // A[row][i] -c * A[i][i] = 0 は確定しているので、 65 // 計算しなくてもよい。 66 for (int col = i + 1; col < n; ++col) 67 A[row][col] += -tmp * A[i][col]; 68 printf("---> eliminate: row %d + %f * row %d\n", row, tmp, i); 69 print_matrix(A); 70 } 71 } 72 73 // 結果 74 printf("result\n"); 75 print_matrix(A); 76}
original 2.000000 -1.000000 6.000000 3.000000 2.000000 -2.000000 4.000000 2.000000 -1.000000 3.000000 -4.000000 4.000000 3.000000 -2.000000 12.000000 12.000000 step 0 ---------------------------- swap rows: 0 <--> 3 3.000000 -2.000000 12.000000 12.000000 2.000000 -2.000000 4.000000 2.000000 -1.000000 3.000000 -4.000000 4.000000 2.000000 -1.000000 6.000000 3.000000 ---> A[1][0] / A[0][0] = 0.666667 ---> eliminate: row 1 + 0.666667 * row 0 3.000000 -2.000000 12.000000 12.000000 0.000000 -0.666667 -4.000000 -6.000000 -1.000000 3.000000 -4.000000 4.000000 2.000000 -1.000000 6.000000 3.000000 ---> A[2][0] / A[0][0] = -0.333333 ---> eliminate: row 2 + -0.333333 * row 0 3.000000 -2.000000 12.000000 12.000000 0.000000 -0.666667 -4.000000 -6.000000 0.000000 2.333333 0.000000 8.000000 2.000000 -1.000000 6.000000 3.000000 ---> A[3][0] / A[0][0] = 0.666667 ---> eliminate: row 3 + 0.666667 * row 0 3.000000 -2.000000 12.000000 12.000000 0.000000 -0.666667 -4.000000 -6.000000 0.000000 2.333333 0.000000 8.000000 0.000000 0.333333 -2.000000 -5.000000 step 1 ---------------------------- swap rows: 1 <--> 2 3.000000 -2.000000 12.000000 12.000000 0.000000 2.333333 0.000000 8.000000 0.000000 -0.666667 -4.000000 -6.000000 0.000000 0.333333 -2.000000 -5.000000 ---> A[2][1] / A[1][1] = -0.285714 ---> eliminate: row 2 + -0.285714 * row 1 3.000000 -2.000000 12.000000 12.000000 0.000000 2.333333 0.000000 8.000000 0.000000 0.000000 -4.000000 -3.714286 0.000000 0.333333 -2.000000 -5.000000 ---> A[3][1] / A[1][1] = 0.142857 ---> eliminate: row 3 + 0.142857 * row 1 3.000000 -2.000000 12.000000 12.000000 0.000000 2.333333 0.000000 8.000000 0.000000 0.000000 -4.000000 -3.714286 0.000000 0.000000 -2.000000 -6.142857 step 2 ---------------------------- ---> A[3][2] / A[2][2] = 0.500000 ---> eliminate: row 3 + 0.500000 * row 2 3.000000 -2.000000 12.000000 12.000000 0.000000 2.333333 0.000000 8.000000 0.000000 0.000000 -4.000000 -3.714286 0.000000 0.000000 0.000000 -4.285714
result 3.000000 -2.000000 12.000000 12.000000 0.000000 2.333333 0.000000 8.000000 0.000000 0.000000 -4.000000 -3.714286 0.000000 0.000000 0.000000 -4.285714

投稿2018/10/17 10:14

編集2018/10/17 14:55
tiitoi

総合スコア21956

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

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

slushii

2018/10/17 10:37

上三角行列は対角成分よりも下側の成分が 0 である行列ではなかったでしょうか。
tiitoi

2018/10/17 10:46

> 与えられた行列に対する上三角行列をを表示する すいません。おっしゃる通りです。 だとすると、与えられた行列の上三角行列を表示するというのはどういう意味でしょうか? 行列の対角成分より下側に0を代入して上三角行列を作るということですか?
slushii

2018/10/17 12:13

ガウスの消去法で各行の間で計算していって対角成分より下側に0を作っていく感じではないかと思っているのですが。。。
tiitoi

2018/10/17 12:39

つまり、質問内容は「(ガウスの消去法の前進消去で)与えられてた行列を上三角行列にする方法について知りたい」ということでしょうか?
slushii

2018/10/17 13:07

そうです!
slushii

2018/10/17 13:08

説明不足で済みませんでした。
tiitoi

2018/10/17 14:56

ガウスの消去法を追記しました。
episteme

2018/10/17 18:56

そっちかよ...
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問