見出し画像

max/msp gen~ 数値計算 逆行列を求める。


max/msp gen~でガウスジョルダン法を使って逆行列を求めます。

このような感じで3行3列の行列の要素を入力すると逆行列を出力します。

MATLABで同じ行列の逆行列を求めたものです。
おおよそ同じような解が出力されています。

gen~の中身はこんな感じです。


gen~の中身です。

Data a(3,3);
Data b(3,6);

N=3;eps=0.00001;
piv0t=0;delta=0;x=0;y=0;i=0;j=0;k=0;
no_exist=0;
b_ij=0;b_kj;

poke(a,in1,0,0);poke(a,in2,0,1);poke(a,in3,0,2);
poke(a,in4,1,0);poke(a,in5,1,1);poke(a,in6,1,2);
poke(a,in7,2,0);poke(a,in8,2,1);poke(a,in9,2,2);

for(y=0;y<N;y+=1){
  for(x=0;x<N;x+=1){
    poke(b,peek(a,y,x),y,x);
    poke(b,0.0,y,x+N);
  }
  poke(b,1.0,y,y+N);	
}

for(i=0;i<N;i+=1){
 pivot = peek(b,i,i);
 if( abs(pivot) < eps){
      no_exist=1;
   }	
 
 for(j=1; j<2*N;j+=1){
   b_ij=peek(b,i,j);
   poke(b,b_ij/pivot,i,j);
 }
 for(k=0;k<N;k+=1){
   delta = peek(b,k,i);
   for(j=i;j<2*N;j+=1){
     if(k != i){
      b_kj=peek(b,k,j)-delta*peek(b,i,j);
      poke(b,b_kj,k,j);
     }
   }
 }
}

out1=peek(b,0,0+N);out2=peek(b,0,1+N);out3=peek(b,0,2+N);
out4=peek(b,1,0+N);out5=peek(b,1,1+N);out6=peek(b,1,2+N);
out7=peek(b,2,0+N);out8=peek(b,2,1+N);out9=peek(b,2,2+N); out10=no_exist;










よろしければサポートお願いします!