#include(stdio.h)
int main(){
double a[4][4]={{1,2,0,-1},{-1,1,2,0},{2,0,1,1},{1,-2,-1,1}}; //入力用の配列
double inv_a[4][4]; //ここに逆行列が入る
double buf; //一時的なデータを蓄える
int i,j,k; //カウンタ
int n=4; //配列の次数
//単位行列を作る
for(i=0;i<n;i++){
for(j=0;j<n;j++){
inv_a[i][j]=(i==j)?1.0:0.0;
}
}
//掃き出し法
for(i=0;i<n;i++){
buf=1/a[i][i];
for(j=0;j<n;j++){
a[i][j]*=buf;
inv_a[i][j]*=buf;
}
for(j=0;j<n;j++){
if(i!=j){
buf=a[j][i];
for(k=0;k<n;k++){
a[j][k]-=a[i][k]*buf;
inv_a[j][k]-=inv_a[i][k]*buf;
}
}
}
}
//逆行列を出力
for(i=0;i<n;i++){
for(j=0;j<n;j++){
printf(" %f",inv_a[i][j]);
}
printf("\n");
}
}
という、4次元正方行列の逆行列を求めるプログラムがあるのですが
これを複数の行列の逆行列が求められる関数にする場合を教えてください・・行列は配列で作ってるのでよくわかりません、お願いします
No.2ベストアンサー
- 回答日時:
もともとのコードが正しければ(逆行列を求めるロジックに誤りがなければ)、
こんな感じでよいのではないかと思います。
#include <stdio.h>
#define N (4)//配列の次数
void getInverseMatrix(double (*a)[N], double (*b)[N])
{
double buf;//一時的なデータを蓄える
int i, j, k;//カウンタ
//単位行列を作る
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++) {
b[i][j] = (i == j) ? 1.0 : 0.0;
}
}
//掃き出し法
for (i = 0; i < N; i++) {
buf = 1 / a[i][i];
for (j = 0; j < N; j++) {
a[i][j] *= buf;
b[i][j] *= buf;
}
for (j = 0; j < N; j++) {
if (i != j) {
buf = a[j][i];
for (k = 0; k < N; k++) {
a[j][k] -= a[i][k] * buf;
b[j][k] -= b[i][k] * buf;
}
}
}
}
}
void printMatrix(double (*a)[N])
{
int i, j;
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++) {
printf("%10.6f", a[i][j]);
}
putchar('\n');
}
}
int main(void)
{
double a[N][N] = {//入力用の配列
{ 1, 2, 0, -1},
{ -1, 1, 2, 0},
{ 2, 0, 1, 1},
{ 1, -2, -1, 1}
};
double b[N][N] = {//入力用の配列
{ 2, 0, -2, 3},
{ -4, -1, 1, 1},
{ 0, 3, -2, -1},
{ 1, -1, 0, 4}
};
double inv[N][N];//ここに逆行列が入る
printf("【行列a】\n");
printMatrix(a);
getInverseMatrix(a, inv);
printf("【行列aの逆行列】\n");
printMatrix(inv);
printf("\n【行列b】\n");
printMatrix(b);
getInverseMatrix(b, inv);
printf("【行列bの逆行列】\n");
printMatrix(inv);
return 0;
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
- C言語・C++・C# LU分解法のピボッティングについて(C言語/gcc-9) 3 2022/07/11 23:10
- C言語・C++・C# LU分解法のピボット選択機能実装について(C言語・gcc-9) 1 2022/07/22 15:20
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# このプログラミングの問題を教えて欲しいです。 キーボードから整数kを入力し、kが配列aの中に何個存在 2 2022/12/19 22:50
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
C言語の型による処理速度の違い
-
C言語を実行すると-infが出てき...
-
doubleは常に%lfとするべきなのか
-
プログラミングについての質問
-
関数におけるif文とreturn文に...
-
float?数字の後にLがつくもの
-
doubleの変数にintとintの割り...
-
c言語のコンパイルエラー canno...
-
浮動小数点数が表示されないん...
-
はさみうち法のプログラム(C言...
-
方程式を2分法を用いて解くプロ...
-
C 開放してるのにエラー(doubl...
-
float型とdouble型の変数の違い...
-
C言語
-
c++,visual studioで積分のプロ...
-
C言語のpow関数の不具合
-
DWORDの警告
-
至急です! マクロ定義で #defi...
-
2分法で方程式の複数の解を自...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
float型とdouble型の変数の違い...
-
doubleの変数にintとintの割り...
-
C言語を実行すると-infが出てき...
-
C 開放してるのにエラー(doubl...
-
至急です! マクロ定義で #defi...
-
c言語で、繰り返し文の中で、0....
-
関数におけるif文とreturn文に...
-
C言語 関数プロトタイプ宣言の...
-
C言語初心者 構造体 課題について
-
C言語の型による処理速度の違い
-
Cで3乗根を求める方法
-
C言語で-23乗を取り扱うには
-
2分法で方程式の複数の解を自...
-
doubleは常に%lfとするべきなのか
-
c言語のコンパイルエラー canno...
-
C言語で直角三角形の斜辺を求め...
-
C言語のプログラムで#include<m...
-
int とdoubleの比較
-
C++で外積
おすすめ情報