ひとモノBLOG

06 « 2017 / 07 » 08
Sun Mon Tue Wed Thu Fri Sat
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 - - - - -
profile
SHOO
  • SHOO
  • 機械系の学生。の割にプログラミングとかのほうが得意だったり。
  • RSS
links
BLOG内検索
Adds by DTI Blog

D言語で行列計算
2009/10/03(土) [01:29:43]

今回はD言語で行列計算をするライブラリ「lyla」を使ってみようと思います。

今回はあとでまとめを書くのが面倒なので、やったことをリアルタイムに記録していく形式とします。

詳しくは以下から

とりあえずMercurialとか持っていないので適当にアーカイブを落とします
http://www.dsource.org/projects/lyla
Current Release
Lyla 0.2
解凍すると lyla-dなるフォルダが出てきました。
中にはdsss.confファイルが入っているので、勝手にdsssに対応していると考えました。
この中でコンソールを開き、

$ dsss build
WARNING: Section for nonexistant file dsss_objs.
lyla => DD-lyla

test.d => test
WARNING: Module test.d does not have a module declaration. This can cause proble
ms
         with rebuild's -oq option. If an error occurs, fix this first.

とりあえずコンパイルできた模様。

…ライブラリファイルがない。

とおもったら、どうやらこれはsourcelibraryのもよう。
つまり、中身が全部templateとかそんな理由でしょうか、ライブラリファイルを生成することなく使用することのできるライブラリのようです。
試しに、srcフォルダに潜って、dmd -run test.dとしてみると…

ものすごくシンボルエラーです。

どうやら、sourcelibraryとはうそっぱちだったようです。src内の.dファイルだけ拾ってライブラリをコンパイルする必要がありそうです。
あ、でも、Testsとかの中身はいらないか。中身見たらどうやら本当にテストコードっぽいし

$ dmd -lib -oflyla.lib -inline -O -release lylaBaseMatrix.d lylaBinary.d lyla
BLAS.d lylaBLASOperations.d lylacblas.d lylaDenseImpl.d lylaElementary.d lyl
aFunctions.d lylaInterfaces.d lylaIterator.d lylaMath.d lylaMatrix.d lylaM
atrixIface.d lylaOperations.d lylaRange.d lylaResult.d lylasort.d lylaSpars
eImpl.d lylaTypes.d lylaUnary.d lylaVector.d lylaVectorIface.d

無事、lyla.libを生成することができました。
あとはこれをlibフォルダに入れ、lylaフォルダをimportフォルダに入れておきます。インストール完了。

ちなみに、dsssで生成されたものは、test.exeという、テスト用のプログラムでした。
実行すると、何らかの計算をしたのでしょう、以下のようなものが現われました

$ test
0.000 0.000
10.000 10.000
20.000 20.000
30.000 30.000
40.000 40.000
50.000 50.000
60.000 60.000
70.000 70.000
80.000 80.000
90.000 90.000




次は、実際に使ってみようと思います。
APIを見てみると…
って、公式HPにAPI一覧がない…!?
まぁ、0.2だし…ということであきらめよう。
dsss build --doc
でAPI一覧の生成ができる。

しょうがないので、
http://www.dsource.org/projects/lyla/wiki/QuickStart
と生成したAPI一覧を見て行くことにする。

まずは適当にmain.dファイルをつくってみる。
今回使うのはTangoだが、Phobosにも対応しているように見える。
試してはいない。

う〜ん、どこを見ればいいのかいまいち判然としないが、
とりあえずlyla.Matrixの中にDMatrixというdouble型のMatrixがあるようなので、これを使ってみる。


debug import tango.core.stacktrace.TraceExceptions;
import tango.io.Stdout;
import lyla.Matrix;
pragma(lib, "lyla");

void main()
{
    auto mat = new DMatrix(33,
        (size_t i, size_t j){ return i==j ? 1.00.0; });
    for (int i; i<mat.n_rows; i++)
    {
        for (int j; j<mat.n_cols; j++)
        {
            Stdout.format("{}t", mat[i,j]);
        }
        Stdout.newline;
    }
}



$ dmd -run main
1.00 0.00 0.00
0.00 1.00 0.00
0.00 0.00 1.00

とりあえず単位行列を作ってみました。
コンストラクタで初期化するとき、1つ目の引数に行数、2つ目の引数に列数、3つ目の引数で初期化の方法を記述します。
今回はデリゲートを使って、行と列の一致するときのみ1とし、単位行列を生成しています。
どうやらうまくいったようで、ちゃんと表示されました。

Matrixには、opIndex(size_t,size_t)やopIndexAssign(value_t,size_t,size_t)が定義されているらしく、mat[i,j]のようにそれぞれ行、列として値の設定/取得がができます。また、行数を取得するのはmat.n_rows、列数を取得するのはmat.n_colsで行えるようです。命名規則がlowerClamelじゃないんですね。D的なlowerCamelになれるとちょっと古臭く感じる。C++標準的な。



つぎに、行列の掛け算をしてみます。


debug import tango.core.stacktrace.TraceExceptions;
import tango.io.Stdout;
import lyla.Matrix;
pragma(lib, "lyla");

void main()
{
    auto mat = new DMatrix(33,
        (size_t i, size_t j){ return i==j ? 1.00.0; });
    mat *= mat * 3;
    for (int i; i<mat.n_rows; i++)
    {
        for (int j; j<mat.n_cols; j++)
        {
            Stdout.format("{}t", mat[i,j]);
        }
        Stdout.newline;
    }
}

1行加えて、 mat・mat・3 の計算をしてみました。
どうやら行列・行列の内積や行列×実数などの計算が行えるようです。

$ dmd -run main
3.00 0.00 0.00
0.00 3.00 0.00
0.00 0.00 3.00

結果もよさげ。
どうやら計算方法の実装は、BLASという、行列計算用のライブラリインターフェースに対応しているらしく、換装可能?であるようです。



とりあえずできることの一部はこのような感じになっているようです。行列式や、逆行列、転置行列を求めるなど、より複雑な操作は、ちょっとよくわかりませんでしたが、とりあえずそんなライブラリがあるよということでした。


rel="prev"<<くそ、OpenGLまともに使える環境ねぇのかよ…! | ホーム |

この記事に対するトラックバック

この記事のトラックバックURL

-

管理人の承認後に表示されます

  • From: |
  • 2013/10/17(木) 17:19:21

この記事に対するコメント

この記事にコメントする

管理者にだけ表示を許可する
| HOME |