2011-12-27 52 views
1

我一直在研究需要在矩阵上做一些工作的算法,并且我在Linux机器上已经获得了一些简单的代码。下面是摘录:Win32上的LAPACK

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的代码工作,但我看到段错误和无效输出。我将继续使用gdb来确定错误的位置,但我怀疑有一个更好,更清洁,更便携的方法来完成这项工作。

我做的是编译安装fortran for mingw(mingw-get install fortran)并链接到32位BLAS和LAPACK dll的早期链接。

我不知道我在这里失去了多少......当使用gcc for win32进行编码时,其他人如何获得他们的LAPACK?

我在找的是一个易于使用的C界面。我不想在所有地方包装类。

我试图找到英特尔MKL的下载...甚至不是自由软件!?

回答

3

我解决了这个问题。它与我调用例程的方式无关,在将值累积到它们之前,我的缓冲区未能达到零。

调用fortran例程基本上和从Linux上直接调用一样简单。

但是,另一个相当严重的问题出现了:一旦我使用lapack例程,我的程序不再处理异常。见here