VB.NET は、標準の行列計算ライブラリを持っていないので、その対策として R を使用する例。
まずは前準備として、nuget で R.NET を入手します。
以下コード例。
注意点としては、結果を得る際に .AsNumericMatrix でデータを引き出しますが、これは拡張メソッドなので「Imports RDotNet.SymbolicExpressionExtension」が必須です。
' Imports 必須 Imports RDotNet.SymbolicExpressionExtension Module Module1 Sub Main() ' Rのインストールフォルダに PATH を通す (通っていればなくてもよい) Environment.SetEnvironmentVariable("PATH", Environment.GetEnvironmentVariable("PATH") & ";C:Program FilesRR-3.0.2bini386") ' --------------- ' 初期化 ' --------------- Dim r = RDotNet.REngine.CreateInstance("RDotNet") r.Initialize() ' --------------- ' データの入力 ' --------------- Dim xData = New RDotNet.NumericMatrix(r, {{1, 2, 3}, {4, 5, 6}}) r.SetSymbol("x", xData) Dim yData = New RDotNet.NumericVector(r, {2}) r.SetSymbol("y", yData) Dim zData = New RDotNet.NumericMatrix(r, {{7, 8}, {9, 10}, {11, 12}}) r.SetSymbol("z", zData) ' --------------- ' 計算 ' --------------- ' 行列積 (f = x・y・z) を計算 Dim f = r.Evaluate("f = (x * y) %*% z") ' その逆行列 (g = 1/f) を計算 Dim g = r.Evaluate("g = solve(f)") ' 行列積と逆行列の積 (h = f・g) を計算 Dim h = r.Evaluate("h = f %*% g") ' --------------- ' 結果の取得 ' --------------- Dim fData = f.AsNumericMatrix Dim gData = g.AsNumericMatrix Dim hData = h.AsNumericMatrix ' --------------- ' 結果の表示 ' --------------- Console.WriteLine("f = {0,8:0}, {1,8:0}", fData(0, 0), fData(0, 1)) Console.WriteLine(" {0,8:0}, {1,8:0}", fData(1, 0), fData(1, 1)) Console.WriteLine() Console.WriteLine("g = {0,8:0.00}, {1,8:0.00}", gData(0, 0), gData(0, 1)) Console.WriteLine(" {0,8:0.00}, {1,8:0.00}", gData(1, 0), gData(1, 1)) Console.WriteLine() Console.WriteLine("h = {0,8:0.00}, {1,8:0.00}", hData(0, 0), hData(0, 1)) Console.WriteLine(" {0,8:0.00}, {1,8:0.00}", hData(1, 0), hData(1, 1)) Console.WriteLine() ' --------------- ' 終了 ' --------------- r.Close() r.Dispose() End Sub End Module
結果
f = 116, 128 278, 308 g = 2.14, -0.89 -1.93, 0.81 h = 1.00, 0.00 0.00, 1.00 続行するには何かキーを押してください . . .