
#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で質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
至急です! マクロ定義で #defi...
-
c言語で、繰り返し文の中で、0....
-
C++で外積
-
C言語の型による処理速度の違い
-
C 開放してるのにエラー(doubl...
-
doubleの変数にintとintの割り...
-
2次方程式の解を求めるプログ...
-
プログラムでの数字につく”f”の...
-
C言語で台形公式を使った二重積...
-
listに構造体を格納
-
C言語でのプログラム作成について
-
int とdoubleの比較
-
2分法で方程式の複数の解を自...
-
浮動小数点の定数
-
型変換のitoaのaって?
-
DWORDの警告
-
^この記号を使わない
-
マチンの公式による円周率のプ...
-
三角関数のグラフ
-
c言語のプログラミングについて...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
C言語を実行すると-infが出てき...
-
doubleの変数にintとintの割り...
-
float型とdouble型の変数の違い...
-
c言語で、繰り返し文の中で、0....
-
至急です! マクロ定義で #defi...
-
C 開放してるのにエラー(doubl...
-
C言語の型による処理速度の違い
-
C言語 関数プロトタイプ宣言の...
-
float と double
-
ラグランジュの補間法のCプログ...
-
C言語のプログラムで#include<m...
-
c言語のコンパイルエラー canno...
-
2分法で方程式の複数の解を自...
-
2次方程式の解を求めるプログ...
-
C言語で台形公式を使った二重積...
-
Cプログラミングの問題です。ニ...
-
物体が往復する動きを作りたい
-
関数におけるif文とreturn文に...
-
doubleは常に%lfとするべきなのか
おすすめ情報