potisanのプログラミングメモ

趣味のプログラマーがプログラミング関係で気になったことや調べたことをいつでも忘れられるようにメモするブログです。はてなブログ無料版なので記事の上の方はたぶん広告です。記事中にも広告挿入されるみたいです。

R.NETがすごい!

R.NETがすごいです。C#の標準機能では提供されない主成分分析やグラフ画像の作成を簡単かつ信頼できる方法で実行できます。詳細は以下のリンクから。また、Microsoft Visual Studio 2019であればNuGet パッケージマネージャーからプロジェクトへお手軽にインストールできます。

www.nuget.org github.com rdotnet.github.io

以下のソースコードで適当な画像ファイルのRGB情報からセンタリング&スケーリングした主成分スコアを算出することができます。

using System.Drawing;
using System.Drawing.Imaging;
using RDotNet;

namespace ConsoleApp1
{
    class Program
    {
        static void Main()
        {
            var bmp = new Bitmap(<画像ファイルのパス>);
            var bmpData = bmp.LockBits(
               new Rectangle(0, 0, bmp.Width, bmp.Height),
               ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
            var pixelNo = bmpData.Width * bmpData.Height;
            var colors = new double[pixelNo, 3];
            unsafe
            {
                var pixels = (int*)bmpData.Scan0;
                for (long i = 0; i < pixelNo; i++)
                {
                    var rgb = Color.FromArgb(pixels[i]);
                    colors[i, 0] = rgb.R;
                    colors[i, 1] = rgb.G;
                    colors[i, 2] = rgb.B;
                }
            }
            bmp.UnlockBits(bmpData);

            var pcaScores1 = default(double[]);
            var pcaScores2 = default(double[]);
            var pcaScores3 = default(double[]);
            // NOTE: プロジェクトの32/64ビットをインストールしたRと合わせてください。
            using (var instance = REngine.GetInstance())
            {
                instance.Initialize();
                instance.SetSymbol("x", instance.CreateNumericMatrix(colors));
                instance.Evaluate("x.pca <- prcomp(x, scale=TRUE, center=TRUE)");
                pcaScores1 = instance.Evaluate("x.pca$x[,1]").AsNumeric().ToArray();
                pcaScores2 = instance.Evaluate("x.pca$x[,2]").AsNumeric().ToArray();
                pcaScores3 = instance.Evaluate("x.pca$x[,3]").AsNumeric().ToArray();
            }
        }
    }
}