2011-12-27 10 views
1

私は行列に関するいくつかの作業を必要とするアルゴリズムを探求しています。私はLinuxマシンで作業する簡単なコードを手に入れました。以下はその抜粋です:LAPACK on Win32

extern "C" { 
    // link w/ LAPACK 
    extern void dpptrf_(const char *uplo, const int *n, double *ap, int *info); 
    extern void dpptri_(const char *uplo, const int *n, double *ap, int *info); 
    // BLAS todo: get sse2 up in here (ATLAS?) 
    extern void dgemm_(const char *transa, const char *transb, const int *m, 
      const int *n, const int *k, const double *alpha, const double *a, 
      const int *lda, const double *b, const int *ldb, const double *beta, 
      double *c, const int *ldc); 
} 

// in-place: be sure that (N*(N+1)/2) doubles have been initialized 
inline void invert_mat_sym_packed(double *vd, int n) { 
    int out = 0; 
    dpptrf_("U",&n,vd,&out); 
    ASSERT(!out); 
    dpptri_("U",&n,vd,&out); 
    ASSERT(!out); 
} 

// use with col-major ordering!!! 
inline void mult_cm(double *a, double *b, double alpha, int m, int k, int n, double *c) { 
    int lda = m, ldb = k, ldc = m; double beta = 1.0; 
    dgemm_("N","N",&m,&n,&k,&alpha,a,&lda,b,&ldb,&beta,c,&ldc); 
} 

私がしなければならなかったすべてはsudo apt-get install liblapack、およびライブラリに対してリンクでした。

私は現在、このコードをMinGWから、hereの32ビットDLLを使用して取得しようとしていますが、segfaultsと無効な出力が表示されています。エラーの場所を特定するためにgdbを実行しますが、これを行うにはより良い、よりきれいで、より移植性の高い方法があると思われます。

コンパイルするにはmingw(mingw-get install fortran)用のfortranをインストールし、以前のリンクから32ビットBLASとLAPACK dllにリンクしてください。

私はここでどれくらい紛失しているのかよくわかりません... gccでwin32をコーディングすると、他の誰もがLAPACKをどうやって取得できますか?

私が探しているのは、使いやすいCインターフェイスです。私はラッパークラスを全面的に望んでいません。

インテルMKLのダウンロードを検索しようとしました...フリーソフトウェアでもありません!

答えて

3

私はこの問題を解決しました。私がルーチンを呼び出す方法とは何の関係もなく、私はmemsetに値を累積する前にゼロにしていませんでした。

Fortranルーチンを呼び出すことは、基本的にLinuxから行うのと同じくらい簡単です。

しかし、別の重大な問題が発生しました.Lapackルーチンを使用すると、プログラムは例外を処理しなくなりました。 hereを参照してください。