2016-05-25 9 views
1

次のコードをすべて理解することができません。私が指摘しているコードの中間部分は乗算を実行していると思いますが、私は確信が持てません。誰かがコードの途中で何を達成しようとしているのかを教えてください。未知の操作を実行している行列操作コード

実際の操作ではなく、配列要素の入出力部分を理解しています。

私はこれを理解する:

#include "stdafx.h" 
    #include<iostream> 
    using namespace std; 
    int main() 
    { 
     int i,j,k,n; 
     float a[100][200],t; 
     cout<<"Enter order of matrix-"; 
     cin>>n; 
     cout<<"Enter elements of matrix"<<endl; 
     for(i=0;i<n;i++) 
      for(j=0;j<n;j++) 
      cin>>a[i][j]; 

をしかし、以下の行が混乱している:ここでも

 for(i=0;i<n;i++) 
     { 
      for(j=n;j<2*n;j++) 
      { 
       if(i==j-n) 
       a[i][j]=1; 
      else 
       a[i][j]=0; 
      } 
     } 
     for(i=0;i<n;i++) 
     { 
      t=a[i][i]; 
      for(j=i;j<2*n;j++) 
       a[i][j]=a[i][j]/t; 
      for(j=0;j<n;j++) 
      { 
      if(i!=j) 
      { 
       t=a[j][i]; 
       for(k=0;k<2*n;k++) 
        a[j][k]=a[j][k]-t*a[i][k]; 
       } 
      } 
     } 

、次の行は理解している:

cout<<"\n\nInverse matrix\n\n"; 
     for(i=0;i<n;i++) 
     { 
      for(j=n;j<2*n;j++) 
      cout<<"\t"<<a[i][j]; 
      cout<<"\n"; 
     } 
    return 0; 
    } 

答えて

0

コードが反転しようとしていますマトリックス。コードが何をしているかは次のとおりです。あなたはn×nの行列Aを持っていることを、我々は新しいnx2n行列Iはn×nの単位行列である

B = AI

を作成することができると仮定すると、

。 Bの作成は、これらの線がやろうとしているものである。

for(i=0;i<n;i++) 
     { 
      for(j=n;j<2*n;j++) // makes sure you are only accessing columns in the right hand part of the matrix 
      { 
       if(i==j-n) 
       a[i][j]=1; 
      else 
       a[i][j]=0; 
      } 
     } 

あなたは第3のマトリックスが得られ、左側の単位行列を取得するには、この2nの広いマトリックス上行の一連の操作を行います私は再びn×nの単位行列である

C = ID

。行操作によるCの作成は、コードのこの部分がしようとしているものです(ただし、これを行ってからしばらくしていたアルゴリズムの正しさについては言及しませんが、通常はあなたが成功した行の操作を完了し、C行列の左側の単位行列を取得するときだけ)

for(i=0;i<n;i++) //transform B matrix into C matrix 
     { 
      t=a[i][i]; 
      for(j=i;j<2*n;j++) 
       a[i][j]=a[i][j]/t; 
      for(j=0;j<n;j++) 
      { 
      if(i!=j) 
      { 
       t=a[j][i]; 
       for(k=0;k<2*n;k++) 
        a[j][k]=a[j][k]-t*a[i][k]; 
       } 
      } 
     } 

の逆数のためのSVDアルゴリズムを使用することは、今、それはそれを構成するのn×n D行列が判明します我々は

AD = I

012を持っているので、C行列の右側には、Aの逆であります

これはコードの最後のビットが私がCマトリックスと呼んでいたものの右側をつかむ理由です。

これはあなたのコードが行うことです。その背後にある理論についてもっと理解したいのであれば、 "Numerical Recipes in C"の本を見てみましょう。この種のもののための金本位制であり、オンラインで自由に入手できます。 http://www.nrbook.com/a/bookcpdf.html

+0

これを行うより簡単な方法はありますか? – Ahmed

+0

一般的ではありません。あなたの行列が2x2であれば、cramerの規則と呼ばれるものを使うことができますが、一般的には、このような "特異値分解"に悩まされています。数値レシピの本にはSVDがありますので、必要に応じて複雑さを比較することができます。 –

関連する問題