ライブラリの現状

C#で数値計算(その8) - KrdLabの不定期日記で作っていたライブラリを,最近になって書き直しています.
※公開してみました→http://d.hatena.ne.jp/KrdLab/20080101/1199199036

そもそも,このライブラリは・・・

目的:

大学で頑張る研究者の方に,.NET Framework 上(C#とかVBとか)で使える数値計算・統計処理機能を提供したい
(え? .NET Framework 便利じゃないですか?)

実装方針:

既存の資産を最大限活用する(実際,内部ではCLAPACKとGSLを使っています)

実装済み項目:

  • 行列・ベクトル
  • 逆行列計算
  • 固有値分解
  • 特異値分解
  • 連立方程式の解
  • 相関分析(といっても相関行列を求めるだけ)
  • 重回帰分析
  • 主成分分析
  • 判別分析
  • t検定
  • f検定
  • XSV(StreamとMatrixの相互変換)
  • Wgnuplot(gnuplotにコマンドを送る)

実装予定項目:

  • LU分解
  • マハラノビス距離を用いた判別分析
  • 分散分析

その他いろいろ(必要になったら適宜追加)

その他

  • 何たら分解系はCLAPACKを,それ以外の数値計算処理はGSLを使用しています.
  • 統計処理機能は自前で実装
  • ソースコードは公開予定(というかGSLをリンクしている時点で公開の義務が発生している)
  • 最近は本業の関係で,開発が遅れ気味(言い訳)

サンプル:

// 固有値分解
{
    Matrix m = new Matrix(  new RowVector( 0, 1, -1),
                            new RowVector(-1, 1,  0),
                            new RowVector( 2, 1,  0));

    EigenvalueDecomposition evd = new EigenvalueDecomposition(m);
    evd.Sort(EigenvalueDecomposition.SortOrder.Descending);
}
// 重回帰分析とgnuplotによる表示
ColumnVector Y = new ColumnVector(41.7, /* たくさんのデータ */, 48.6);
RowVector[] Xs = new RowVector[]{
    new RowVector( 7, 16),
    
    // たくさんのデータ
    
    new RowVector(15, 18)
};

MultipleLinearRegressionAnalysis mra = new MultipleLinearRegressionAnalysis(Y, Xs);

using (Wgnuplot plot = new Wgnuplot())
{
    XsvFormat format = new XsvFormat();
    format.DataFormat = XsvDataFormatType.Table;
    format.Encoding = Encoding.GetEncoding("shift_jis");
    format.HasHeader = false;
    format.HasIndexes = false;
    format.Separator = '\t';

    using (XSV xsv = new XSV(new FileStream("tmp.dat", FileMode.Create), format))
    {
        // gnuplotのデータフォーマットにする
        Matrix m = new Matrix(Xs.Length, 3);
        for (int r = 0; r < m.RowSize; ++r)
        {
            for (int c = 0; c < m.ColumnSize - 1; ++c)
            {
                m[r, c] = Xs[r][c];
            }
            m[r, 2] = Y[r];
        }
        xsv.Write(m);
    }

    // コマンドを送る
    IVector C = mra.CoefficientVector;
    plot.Send("splot " + C[0] + "+x*" + C[1] + "+y*" + C[2]);
    plot.Send("replot \"tmp.dat\"");
    System.Console.Read();  // 入力待ちにする
}

NDocとNUnitを使っているのですが,SandCastleというのもあるみたい.
ふにゃるんさんが,かなり詳しく紹介してくれています.→Sandcastle Help File Builder を使って、ソースコードからドキュメントを自動作成しよう - ふにゃるん
の,乗り換えるか!?