プロが教えるわが家の防犯対策術!

#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次元正方行列の逆行列を求めるプログラムがあるのですが
これを複数の行列の逆行列が求められる関数にする場合を教えてください・・行列は配列で作ってるのでよくわかりません、お願いします

A 回答 (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;
}
    • good
    • 0
この回答へのお礼

ありがとうございます^o^このあたり勉強不足で・・・助かりました

お礼日時:2008/08/06 17:54

> 複数の行列の逆行列が求められる関数



当該の複数行列は、例題と同じ4行4列ですか?
別の行数・列数にも対応する必要がありますか?

この回答への補足

あ、すいません全部4行4列でお願いします^^;

補足日時:2008/08/06 16:11
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!