シリアル受信プログラムができる見込みなので、データ処理の準備にかかってます。
■計算目的:
自作6分力センサの出力と校正負荷から、6分力センサのひずみゲージ変換係数を干渉補正計算(一般化逆行列、MoorePerose逆行列)をするプログラムを組むのが目的です。
■多軸力覚センサの干渉補正計算の基礎
【ロードセル】干渉補正式の基礎再学習<2年ぶり>
【ロードセル】Processing_MatrixライブラリーでMP逆行列計算<転置だけ自作した>
Processingのライブラリでは、計算できるようになったので、VB.NETでもライブラリー探してやってみました
■.NET 用 行列計算ライブラリImagingsolution様に感謝
[VB.NET 行列ライブラリ」1年以内検索のTOPにでてきました。
https://imagingsolution.net/program/csharp/dotnet_matrix_class/
この解説記事からライブラリーをダウンロードします。
=>C#用にサンプルプログラムしかありませんが、.NET用なので、VB.NETでも使えました。
①ダウンロードファイル
ImagingSolution.Mat_V011.zip
②解凍すると
解凍フォルダーの3段下に ImagingSolution.Mat.dll があります。
これを参照登録します。
■VisualStudio VB.NETでサンプルプログラム作り
解凍したフォルダーにはC#用のサンプルプロジェクトがあるので
ConsoleSample.csprojをダブルクリックすると、VisualStudio2019が起動して
ソースで下部のbitmap部分は使わないのでコメントアウトして、コンソール画面を保持するために
//キー入力待ちを上に移動させます。これで、開始を押すとコンパイルして下記コンソールに
各種行列計算結果が表示されます。
■C#からVB.NETへ移植
C#のusing=>VB.NETのimports
C#のvar =>VB.NETのDim
C#のコメント//=>VB.NETの’
C#の;=>VB.NETでは無いので削除します
C# | VB.NET 変更点赤 |
// 行列(matA)の設定例(二次元配列で行列を設定) var matA = new double[3, 3]; matA[0, 0] = 1; matA[0, 1] = 2; matA[0, 2] = 3; matA[1, 0] = 4; matA[1, 1] = 5; matA[1, 2] = 6; matA[2, 0] = 7; matA[2, 1] = 8; matA[2, 2] = 9;matA.Print(“matA =”); // コンソールへ行列の表示 |
‘行列(matA)の設定例(二次元配列で行列を設定) Dim matA = new double[3, 3] matA(0, 0) = 1 matA(0, 1) = 2 matA(0, 2) = 3 matA(1, 0) = 4 matA(1, 1) = 5 matA(1, 2) = 6 matA(2, 0) = 7 matA(2, 1) = 8 matA(2, 2) = 9matA.Print(“matA =”)‘コンソールへ行列の表示 |
こういうやり方でC#を全部VB.NETに変換します。
Form1(デザイン)にボタン1個作ってください。
Form1.vbコードはGISTに置いてあります。
https://gist.github.com/dj1711572002/fad0d2250d4d1c45c992651fc352ecba
Imports ImagingSolution ‘ImagingSolution.Matクラス用 Public Class Form1 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click ‘========matA==================== Dim matA(2, 2) As Double matA(0, 0) = 1 matA(0, 1) = 2 matA(0, 2) = 3 matA(1, 0) = 4 matA(1, 1) = 5 matA(1, 2) = 6 matA(2, 0) = 7 matA(2, 1) = 8 matA(2, 2) = 9matA.Print(“matA =”) ’ コンソールへ行列の表示 ‘============matB================= Dim matB(2, 2) As Double matB(0, 0) = 1 matB(0, 1) = 4 matB(0, 2) = 8 matB(1, 0) = 6 matB(1, 1) = 2 matB(1, 2) = 5 matB(2, 0) = 9 matB(2, 1) = 7 matB(2, 2) = 3matB.Print(“matB =”) ‘ コンソールへ行列の表示 ‘===========行列(matA)と行列(matA)の積====== Dim matMult = matA.Mult(matB) matMult.Print(“matA matB =”) ‘===========行列(matA)と行列(matA)の加算====== End Sub |
これを実行した結果は、きちんと各種行列計算できてます
‘ System.Double[3,3] 1,2,3 4,5,6 7,8,9matB = System.Double[3,3] 1,4,8 6,2,5 9,7,3matA matB = System.Double[3,3] 40, 29, 27 88, 68, 75 136,107,123 matA + matB = matA – matB = (matB)-1 = matA = (matA)T = RotateMat = ScaleMat = TranslateMat = |