【ロードセル】Processing_MatrixライブラリーでMP逆行列計算<転置だけ自作した>

干渉補正をEXCEL手動計算から、Processingのプログラムでの計算に引っ越し中です。
 Processingの行列ライブラリーの使い方練習と一般逆行列計算練習をしてみました。

●Processingの行列計算ライブラリー Pallav.Matrix

ProcessingIDEに標準でインストールできるようになってます。しかし、内容がわからないので、GITから全ファイルダウンロードします。
Pallav.Matrixというライブラリーです。
https://github.com/pallav12/matrix-library-for-processing

referenceフォルダーに一覧があります。

ダウンロードして、解凍するとMatrixMathというフォルダーができます。MatrixMath->examples->sampleUseCases.pdeがあるので、
processingで起動して走らせます。
ライブラリーの関数のサンプル動作を並べてあります。
特徴1:行列の表記のために Matrix.print()関数があります。
float [][] a={ {1,2,3},{4,5,6},{7,8,9} };と定義すると
Matrix.print(a);
{ { 1,2,3},{4,5,6},{7,8,9} }
のようにコンソールに出力してくれます。

特徴2:行列の表現は2次元配列ですが、普通の配列数と
Matrix型の両方を使えるようになってます。
両者を使い分け方がわかりません。同様に使えます。
配列からMatrix型に変換する関数
Matrix mat_a=Matrix.array(a); では配列aが行列式mat_aになります

特徴3:転置関数は、正方行列でしか動作しません。
しかし、一般逆行列は、矩形行列が基本ですので、Pallav.Matrixの
転置関数 Matrix.traspose()は使えません。

そこで、自分で矩形行列用の転置関数を作りました。
簡単な計算なので、無事一発で走りました。
array_Srcに転置する元の配列、array_Transに転置結果の配列

///======Rectangular Matrix Transpose====================================
void Rect_trans(float [][] array_Src,float [][] array_Trans)
{
int Rnum,Cnum;
int i,j,k;
Rnum=array_Src.length;
Cnum=array_Src[0].length;
println(“Rnum=”,Rnum,”Cnum=”,Cnum);
for(j=0;j<Cnum;j++)
{
for (i=0;i<Rnum;i++)
{
//println(“array_src[“,i,”][“,j,”]=”,array_Src[i][j]);
array_Trans[j][i]=array_Src[i][j];
}
}
//Matrix.print(“array_Src=”,array_Src);
//Matrix.print(“array_Trans=”,array_Trans);
}

●Processingプログラムで動作確認と一般逆行列計算学習

サンプルで使う行列データは、こちらの記事からいただいて、グラフもそっくりそのままいただきました。
「大人になってからの再学習」様に感謝です。
http://zellij.hatenablog.com/entry/20120811/p1

①全体の考え方
わざと解がない連立方程式を作って、近似解を一般逆行列で解かせる学習サンプルです。

これの解をだしたProcessingプログラムは、GISTに掲載してあります。
https://gist.github.com/dj1711572002/e27b093453b8f4eefd4e0d58d7c56359

MatrixTEST02_3LineExample_pallav_Matrix_asampleUseCases.pde

import pallav.Matrix.*;
//Processing Matrix Libraly
//Demonstrating use of some of the static Methods of library
// MatrixTEST00_pallav_Matrix_asampleUseCases.pde
// ==========Shinshu-Makers MatrixLibrary Study no1=============================
int m = 3, n = 2;
float[][] A={{1,1},{1,-1},{0,1}}; //A data array
float[][]B={ {4},{0},{1} }; //B const array
float[][] At=new float [n][m];
float[][] AtA=new float[n][n];// Square Matrix
float[][] AtA_1=new float[n][n];//Inverse Matrix
float[][] MPA=new float[m][m];// Moore_Penrose Inverse Matrix
float [][] XY=new float[1][2];// Calcuration Resultvoid setup()
{
Matrix.print(“array=”,A);
Matrix.print(“array=”,B);
Rect_trans(A,At);//Traspose Rectangular Matrix X
Matrix.print(“At=”,At);
AtA=Matrix.Multiply(At,A);// Multiply Xt X then SquareMatrix get
Matrix.print(“AtA=”,AtA);
AtA_1=Matrix.inverse(AtA);//Inverse Matrix
Matrix.print(“AtA_1=”,AtA_1);
Matrix mAt=Matrix.array(At);//Matrix henkan
Matrix mAtA=Matrix.array(AtA);//Matrix henkan
Matrix mAtA_1=Matrix.array(AtA_1);//Matrix henkan
Matrix mMPA=Matrix.Multiply(mAtA_1,mAt);// Moore-Penrose Inverse Matrix XtX*Xt
Matrix.print(“MPa+=”,mMPA);
Matrix mB=Matrix.array(B);
//Matrix mXY=Matrix.array(XY);
Matrix mXY=Matrix.Multiply(mMPA,mB);
Matrix.print(“mXY=”,mXY);
}
///======Rectangular Matrix Transpose====================================
void Rect_trans(float [][] array_Src,float [][] array_Trans)
{
int Rnum,Cnum;
int i,j,k;
Rnum=array_Src.length;
Cnum=array_Src[0].length;
println(“Rnum=”,Rnum,”Cnum=”,Cnum);
for(j=0;j<Cnum;j++)
{
for (i=0;i<Rnum;i++)
{
//println(“array_src[“,i,”][“,j,”]=”,array_Src[i][j]);
array_Trans[j][i]=array_Src[i][j];}}
//Matrix.print(“array_Src=”,array_Src);
//Matrix.print(“array_Trans=”,array_Trans);
}

//==============================================================

 

●以後
  やってみれば簡単なので、慣れればいいだけでした。
   これを基本にして、リアルタイムで、干渉補正するシステムを作り出します。
    7月いっぱいでできればいいなと考えてます。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です