• 締切済み

R言語の逆行列計算について

R言語の初心者です ある本の通りにプログラムを進めていったところ逆行列を求める際以下のようなことが起こりました > A<-matrix(c(4,7,0,5),nrow=2) > A [,1] [,2] [1,] 4 0 [2,] 7 5 > Ainv<-solve(A) > Ainv [,1] [,2] [1,] 0.25 -1.110533e-17 [2,] -0.35 2.000000e-01 > Ainv %*% A [,1] [,2] [1,] 1.000000e+00 -5.552664e-17 [2,] -5.551115e-17 1.000000e+00 なぜか逆行列を求めるとき複素数が入ってしまいます 本ではちゃんとした値が出ています。すいませんがこれを直して複素数を除く逆行列を求められる 設定方法を教えてください

みんなの回答

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

もしかして 1.000000e+00 のeが虚数単位だと思ってません?

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

複素数? どこが?

関連するQ&A

  • 行列の和の逆行列について

    情報処理系の数学(カルマンフィルタとか)では(A+B+C)^(-1)とか(A+BCF)^(-1)のように行列の和(あるいは行列と行列の積の和)の逆行列の表式があり、公式のようなものが与えられていたりします。その中で例えば(A+B+C)^(-1)でA,B,Cとは何かと言うと行列(普通は正方行列?)なわけですが、例えば単に1つの値(スカラー)であった場合は逆数というのは自然な拡張としてあり得ると思います。1行1列の行列の対角成分だけの行列と見なすわけです。これはいいだろうと思います。問題はAなどがベクトルだったときです。これは計算できないということでいいでしょうか。ベクトルだったら1行N列の行列(N行1列でも)ということであり、逆行列が定義できないということになるでしょうか。カルマンフィルタなどではベクトルではないかと思うものが式の中に入っているのですが。Rで実験してみるとAの逆行列はsolve(A)だけで求まります。Aがスカラーだったら予想どおり逆数なります。ベクトルだったらエラーです。やはりベクトルだと当然ダメということでしょうか。

  • 行列の逆行列について

    行列の逆行列について 行列の逆行列を求める問題です。 掃き出し法や余因子行列を利用して求める等 いろいろ求め方はあると思いますが次の場合どうすれば良いでしょうか? 次の行列の逆行列を求めなさい。 ただしaは複素数とする。 |1 a 0 0| |1 a 0 0| |0 1 a 0| |0 1 a 0| |0 0 1 a| |0 0 1 a| |0 0 0 1| |a 0 0 1| 複素数であれば普段通りの計算は出来ないですよね? 回答お願いします。

  • 逆行列 複素数

    画像の逆行列を求める際 aは複素数で空白は全て0です。 と問題文にあったのですが複素数を含んでいるからといって通常の 逆行列の求め方の変更点は特にないですよね。 4×4行列なので余因子行列は使わず(X E)を行基本変形で求めようと思ってます。

  • 逆行列の計算について

    (1)自作のプログラム (2)excel (3)matlab の3種により逆行列を求めてみたのですが,どれも異なる逆行列を吐き出しました. 逆算して確かめてみたのですが,(1)と(3)は元の行列と掛け合わすと単位行列になったのですが,(2)はなりませんでした. 使用した行列は5*5の行列で下の通りです. 1.48E-03 2.86E-03 -5.22E-04 -1.42E-03 -3.00E-03 2.86E-03 7.05E-03 -3.53E-03 -3.54E-03 -5.74E-03 -5.22E-04 -3.53E-03 4.61E-03 1.18E-03 7.46E-04 -1.42E-03 -3.54E-03 1.18E-03 3.66E-03 3.42E-03 -3.00E-03 -5.74E-03 7.46E-04 3.42E-03 6.27E-03 よろしかったら正しい逆行列を教えてください.

  • 行列からの連立方程式

    数式処理システムMaximaでの行列の計算が上手く出来ません。 以下数式↓ kill(ALL); M1:matrix([fb/f],[1/f]); M2:matrix([1,0],[1/f2,1]); M3:matrix([1,-e1],[0,1]); M4:matrix([1,0],[1/f1,1]); M5:matrix([1],[0]); M6:M2.M3.M4.M5; solve([M6=M1],[e1,fb]); 上記式(solve)を計算した際に値が返ってこないのです。 式を↓の様に入力するときちんと計算されるのですが、何か方法はありますでしょうか? solve([1-e1/f1=fb/f,(1-e1/f1)/f2+1/f1=1/f],[e1,fb]); 教えて頂けたら幸いです。

  • 逆行列の存在

    a^2+b^2+c^2+d^2<1で 行列Aは一行一列目a,一行二列目b,二行一列目c,二行二列目d のとき、E-Aは逆行列をもつことを示せ。Eは単位行列。 考えたのは (1) B(E-A)=E となるBが存在することをしめせばよいと思いましたが、   この形にできませんでした。 (2) (1-a)(1-d)-bc の値が0でないことを、a^2+b^2+c^2+d^2<1を使いしめせば   よいと思い、式変形を試みましたがうまくいきませんでした。   -1<a<1,b,c,dも同様、このことは押さえなければとは思いました よろしくおねがいします

  • 3×3行列の逆行列

    2×2行列の逆行列はいわずと知れた、 A= (a b) (c d) に対し A^(-1)=1/(ad-bc) * (d -b) (-c a) ですよね。 でも3×3行列Xの逆行列X^(-1)の一般式って教科書に載ってないんですよね。 具体的にXが数値的に与えられてるときは基本変形を使って (X E)→…→(E X^(-1)) と逆行列を求める方法は示されてるのですが一般式となると載ってない。 これは書こうとするととんでもなく面倒な式になるからなのでしょうか? X= (x_11 x_12 x_13) (x_21 x_22 x_23) (x_31 x_32 x_33) の逆行列、表せるのであれば教えてください。

  • 数Cの逆行列について

    受験生なのですが、分からない問題があって困っています。 成分が全て実数である行列 A=(a b c d ) があり、a+d=-1,ad-bc=1 とし、E=(1 0 0 1) とする。 実数kの値によらずA-kEは逆行列をもつことを示せ。 です。お願いします。

  • 逆行列の証明

    逆行列の証明 行列Aに対して、AX=Eを満たす行列XをX=(p,q,r,s)とするとap+br=1・・・(1) aq+bs=0・・・・(2) cp+dr=0・・・・(3)、cq+ds=1・・・・(4) (1)×d-(3)×bから(ad-bc)p=d (2)×d-(4)×bから(ad-bc)q=-b (3)×a-(1)×cから(ad-bc)r=-c (4)×a-(2)×cから(ad-bc)s=a ?=ad-bcnot=0のとき p=d/?,q=-b/?,r=-c/?,s=a/?ゆえにX=1/?(d,-b,-c,a) このようにXを定めると、上の計算の逆をたどってAX=E ・・・・・・・以下省略 教えてほしいところ 何故、上の計算の逆をたどる必要があるのか理解できません。 AX=Eが成り立つようなXを求めたんだから、AX=Eが成り立つに決まってませんか??? 確認する必要性を教えてください

  • 部分行列の抜き出し(C言語)

    部分行列の抜き出し(C言語) ある行列から、任意の部分行列を抜き出すような関数を作りたいのですが、わからないので手助けをお願いしたいです。 たとえば4行4列の行列Aがあった場合、その2行2列、2行3列、3行2列、3行3列目の 4つの(2行2列の)要素を抜き出すような関数です。 枠組みは出来ているので載せておきます。 #include <stdio.h> #include <stdlib.h> #include <math.h> typedef struct matrix{ double *data; int size[2]; }MATRIX; MATRIX create_matrix(int m,int l,int a); //行列の作成 void print_matrix(MATRIX A); //行列の表示 MATRIX submatrix(MATRIX matrix_A,int m,int n,int l,int k); //任意の部分行列の抜き出し int main(int argc,char **argv) { //構造体の初期化 MATRIX matrix_A={NULL,NULL,NULL}; MATRIX matrix_B={NULL,NULL,NULL}; MATRIX matrix_C={NULL,NULL,NULL}; int m=0; //行列の行 int l=0; //行列の列 int a=1; //要素 double det=0; //行列計算 //行列Aの作成 m=4;//行 l=4;//列 matrix_A = create_matrix( m, l, a); //関数 matrix_C = submatrix(matrix_A,2,2,3,3); //行列結果出力 printf("\n\tmatrix input"); print_matrix(matrix_A); printf("\n\tmatrix output"); print_matrix(matrix_C); //行列の開放 free(matrix_A.data); matrix_A.data=NULL; free(matrix_C.data); matrix_C.data=NULL; printf("終了!\n\n"); return 0; } MATRIX create_matrix(int m,int l,int a) { MATRIX matrix_A={NULL,NULL,NULL}; int i=0; //サイズの確保 行;size[0] 列;size[1] matrix_A.size[0]=m; matrix_A.size[1]=l; //メモリの確保 matrix_A.data=(double *)malloc(sizeof(double)*matrix_A.size[0]*matrix_A.size[1]); if(matrix_A.data == NULL){ printf("メモリ確保失敗!![matrix_A]\n"); exit(1); } //行列Aの作成 for(i=0; i<((matrix_A.size[0])*(matrix_A.size[1])) ;i++){ *(matrix_A.data+i)=a+i; } return(matrix_A); } /*行列の表示*/ void print_matrix(MATRIX matrix_A) { int i=0; int j; //行 int k; //列 printf("\n行列の表示\n"); //行列Aのプリント for(j=0;j<matrix_A.size[0];j++){ for(k=0;k<matrix_A.size[1];k++){ printf("%f\t",*(matrix_A.data+k*matrix_A.size[0]+j)); } printf("\n"); } return; } MATRIX submatrix(MATRIX matrix_A,int m,int n,int l,int k) { MATRIX matrix_C = {NULL,NULL,NULL}; int i,j; //サイズの確保 行;size[0] 列;size[1] matrix_C.size[0]=l-m+1; matrix_C.size[1]=k-n+1; //メモリの確保 matrix_C.data=(double *)malloc(sizeof(double)*matrix_C.size[0]*matrix_C.size[1]); if(matrix_C.data == NULL){ printf("メモリ確保失敗!![matrix_C]\n"); exit(1); } //任意の部分行列の抜き出し (ここがわかりません。) } よろしくお願いします。