2009-05-15 13 views
3

残念ながら、私はC++での経験はあまりなく、C++で自分自身を進歩させようとしています。配列の配列として行列を定義し、その逆行列をC++で計算する

array< array<double>^ >^ input = gcnew array< array<double>^ >(3); 

for (j=0;j<input->Length;j++){ 
    input[j]=gcnew array<double>(3); 

は、その後、私はアレイの入力アレイにマトリックス要素を割り当てる:私は3x3の行列形成するよう

まず、私は、配列の配列を定義

int value=1; 
for(y=0;y<(3);y++){ 
    for(x=0;x<(3);x++) 
{input[y][x]=value; 
    value=value+1; 
    } 
    } 

をC++関数が存在することこの配列の配列の逆行列を計算しますか?

お願いします。

敬具は...行列演算を行うためのC++には機能はありません

答えて

0

、あなたはそれを行うか、独自に実装するためのいくつかのライブラリを見つける必要があります。固定サイズの配列のために、あなたはこのように、通常のC/C++の配列を使用することができることを

注:

double arr[3][3]; 
0

ウィキペディアは、さまざまなプログラミング言語でlist of numerical librariesを持っています。探している関数が利用できない場合は、使用可能なFortranまたはCまたはC++の実装の周りにラッパー関数を記述することも考えられます。

+0

私はこれに同意します。 Fortranには大量の線形解析コードがあり、それはあなたが望むことを行い、netlib.orgのLapackよりも見栄えの良い場所はありません。 私はまた、配列パラダイムの配列を使用しないことをお勧めします。大部分の外部コードは、配列が行または列の大部分の順序で適切に設定されたブロックのブロックであると予想します。適切なインデックス演算子を持つクラスを作成したり見つけたりするのは、それほど難しいことではありません。 –

0

行列反転(または他の行列計算)を行うためのC++関数は組み込まれていません。

行列反転方法の多くは、あなたが実装効率と使いやすさをしたい場合は、Guassian Eliminationはおそらく最高 あるHERE.

を述べています。 Cに基本行変換を用い

0

行列の逆行列のコード++

#include<iostream> 
#include<stdio.h> 
#include<conio.h> 
using 
namespace std; 

float a[4][4];float b[4][4]={{1,0,0,0},{0,1,0,0},{0,0,1,0},{0,0,0,1}}; 
int no = 4; 

int check(int k) { 
    float cont = 0, cont2 = 0; 
    for (int i = k; i < no; i++) { 
     if (a[i][k] == 1) { 
      for (int j = 0; j < no; j++) { 
       cont = a[i][j]; 
       cont2 = b[i][j]; 
       a[i][j] = a[k][j]; 
       b[i][j] = b[k][j]; 
       a[k][j] = cont; 
       b[k][j] = cont2; 
      } 
     } else if (a[i][k] == 0) { 
      for (int j = 0; j < no; j++) { 
       cont = a[i][j]; 
       cont2 = b[i][j]; 
       a[i][j] = a[no - 1][j]; 
       b[i][j] = b[no - 1][j]; 
       a[no - 1][j] = cont; 
       b[no - 1][j] = cont2; 
      } 
     } 
    } 
    return 0; 
} 

int divi(int k) { 
    float particular = a[k][k]; 
    for (int i = 0; i < no; i++) { 
     a[k][i] = a[k][i]/particular; 
     b[k][i] = b[k][i]/particular; 
     if (a[k][i] == (-0)) { 
      a[k][i] = 0; 
     } 
     if (b[k][i] == (-0)) { 
      b[k][i] = 0; 
     } 
    } 
    return 0; 
} 

int sub1(int k) { 
    float particular; 
    for (int j = k + 1; j < no; j++) { 
     particular = a[j][k]; 
     for (int i = 0; i < no; i++) { 
      a[j][i] = a[j][i] - (particular * a[k][i]); 
      b[j][i] = b[j][i] - (particular * b[k][i]); 
      if (a[j][i] == (-0)) { 
       a[j][i] = 0; 
      } 
      if (b[j][i] == (-0)) { 
       b[j][i] = 0; 
      } 
     } 
    } 
    return 0; 
} 

int sub2(int k) { 
    float particular; 
    for (int j = k - 1; j >= 0; j--) { 
     particular = a[j][k]; 
     for (int i = no - 1; i >= 0; i--) { 
      a[j][i] = a[j][i] - (particular * a[k][i]); 
      b[j][i] = b[j][i] - (particular * b[k][i]); 
      if (a[j][i] == (-0)) { 
       a[j][i] = 0; 
      } 
      if (b[j][i] == (-0)) { 
       b[j][i] = 0; 
      } 
     } 
    } 
    return 0; 
} 

int disp(){ 
cout<<endl; 
      for(int x=0;x<no;x++){ 
      for(int y=0;y<no;y++){ 
        if(a[x][y]==(-0)){a[x][y]=0;} 
        if(b[x][y]==(-0)){b[x][y]=0;} 
        printf("%0.1f|||%0.1f  ",a[x][y],b[x][y]); 
      } 
      cout<<endl;} 
} 

int main() 
{ 
    for(int i=0;i<no;i++){ 
      for(int j=0;j<no;j++){cout<<"Enter a["<<i<<"]["<<j<<"]";cin>>a[i}[j];} 
      } 
    for(int i=0;i<no;i++){ 
      for(int j=0;j<no;j++){cout<<a[i][j]<<" ";} 
    cout<<endl; 
      } 

    for(int i=0;i<no;i++){ 
     check(i); 
      disp(); 
     divi(i); 
      disp(); 
     sub1(i); 
      disp(); 
    } 
    for(int i=no-1;i>=0;i--){ 
    sub2(i); 
    disp(); 
    cout<<endl; 
    } 
    getch(); 
    getch(); 
    getch(); 
return 0;} 

} 
関連する問題