假设我想用LAPACK来解C (GCC)中的线性方程组。我提出的问题如下:
/* Want to solve Ax=b */
int n = ...; // size
double *A = ...; // nxn matrix
double *b = ...; // length-n vector
int m = 1; // number of columns in b (needs to be in a variable)
double *pivot; // records pivoting
int info; // return value现在看来,我可以使用三个函数之一来解决这个问题。第一个问题是:
dgesv_( &n, &m, A, &n, pivot, b, &n, &info );我惊讶地发现,这不需要任何#include,这似乎.真奇怪。
第二个函数具有几乎相同的签名,除了前缀LAPACK_之外,我认为它会引起较少的歧义,并且可能不太容易出错:
#include <lapack/lapacke.h>
LAPACK_dgesv( &n, &m, A, &n, pivot, b, &n, &info );请注意,这要求我包括lapacke.h。
第三个函数通过返回info而不是将所有参数作为指针来更改签名:
#include <lapack/lapacke.h>
info = LAPACKE_dgesv( LAPACK_COL_MAJOR, n, m, A, n, pivot, b, n);同样,这个函数需要lapacke.h。它还需要用-llapacke链接到一个额外的库。这三个函数都需要-llapack。
我试图找出这些函数之间的区别。我在lapacke.h和相关的头文件中发现了以下宏:
#define LAPACK_GLOBAL(name,NAME) name##_
#define LAPACK_dgesv LAPACK_GLOBAL(dgesv,DGESV)因此,LAPACK_dgesv()和dgesv_()似乎是完全相同的函数的不同名称。然而,LAPACKE_dgesv()似乎有着不同的实现,特别是考虑到它需要一个额外的库。
所以我的问题是:这两种功能有什么区别?文档中说,LAPACKE是LAPACK的C接口,但是函数dgesv_()又如何呢?显然,我可以正常使用它,而不需要LAPACKE,也不需要在Fortran中编译任何东西,那么这有什么区别呢?
谢谢。
更新
奇怪的是,函数dgemm_() (矩阵乘法)没有任何LAPACK_dgemm()等价。到底怎么回事?
发布于 2015-07-02 19:23:40
LAPACKE_dgesv()具有一个额外的标志,可以是LAPACK_COL_MAJOR (通常的fortran )或LAPACK_ROW_MAJOR (通常的c顺序)。对于LAPACK_COL_MAJOR,它只是直接调用LAPACK_dgesv()。在LAPACK_ROW_MAJOR的情况下,LAPACKE_dgesv()将在调用LAPACK_dgesv()之前转置矩阵。它不是dgesv_()的新实现。看看这个文件中的work.c,关于错误处理还有一些小的额外的变化。LAPACK_dgesv()在标头lapacke.h中定义为LAPACK_GLOBAL(dgesv,DGESV)。宏LAPACK_GLOBAL是在lapacke_mangling.h中定义的:它只是包装dgesv_,并在使用其他约定时关心命名约定。因此,基本上,函数LAPACK_dgesv()只需要lapacke的头。与dgesv_相比,可以避免与库中的命名约定相关的一些问题。但是LAPACK_dgesv()和dgesv_()完全一样。函数LAPACKE_dgesv()扩大了LAPACK_dgesv()的作用范围,以处理通常的c- matrix.But,最后仍然调用dgesv_。
函数dgemm()是BLAS库的一部分。包装c版本的cblas_dgemm()可以在CBLAS中找到。同样,还需要一个附加标志CBLAS_ORDER,可能的值为CblasRowMajor和CblasColMajor。
https://stackoverflow.com/questions/31170413
复制相似问题