[R][VB.NET] VB.NET から R を使用して行列を計算してみる

2014年12月7日

 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

続行するには何かキーを押してください . . .





カテゴリー: Program, R, VB.NET

Follow comments via the RSS Feed | Leave a comment | Trackback URL

コメントを投稿する

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


«   »
 
Powered by Wordpress and MySQL. Theme by Shlomi Noach, openark.org