我正在尝试使用以下代码解决线性系统:
#include <stdio.h>
#include <lapacke.h>
int main () {
lapack_complex_double mat[4];
lapack_complex_double vec[2];
lapack_int p[2];
mat[0] = lapack_make_complex_double(1,0);
mat[1] = lapack_make_complex_double(1,0);
mat[2] = lapack_make_complex_double(1,0);
mat[3] = lapack_make_complex_double(-1,0);
vec[0] = lapack_make_complex_double(1,0);
vec[1] = lapack_make_complex_double(1,0);
LAPACKE_zgetrf(LAPACK_ROW_MAJOR, 2, 2, mat, 2, p);
LAPACKE_zgetrs(LAPACK_ROW_MAJOR, 'N', 2, 1, mat, 2, p, vec, 2);
printf("%g %g\n", lapack_complex_double_real(vec[0]),
lapack_complex_double_imag(vec[0]));
return 0;
}
由于某些原因,这会导致非法内存访问LAPACKE_zgetrs
(正如valgrind
我的大程序检测到的那样,zgetrs
因为“glibc检测到损坏或双重释放”而崩溃)。为简洁起见,我没有将其包含在我的 SSCCE 中,但所有LAPACKE
返回的例程都返回 0。
相同的代码LAPACK_COL_MAJOR
完美地运行和 valgrinds。
我的 lapacke、lapack 等是为 Ubuntu 12.04 自建的。我在 lapack CMake 文件中使用了以下设置:
BUILD_COMPLEX ON
BUILD_COMPLEX16 ON
BUILD_DOUBLE ON
BUILD_SHARED_LIBS ON
BUILD_SINGLE ON
BUILD_STATIC_LIBS ON
BUILD_TESTING ON
CMAKE_BUILD_TYPE Release
LAPACKE ON
LAPACKE_WITH_TMG ON
其余的(优化的 blas/lapack 和 xblas)关闭。构建过程中没有错误,所有测试都成功了。
我哪里搞砸了?
编辑:我刚刚用 Fedora21 和打包的 lapacke 试过这个。它没有重现错误。
编辑2:虽然它不会重现内存失败,但它会产生错误的解决方案,即(1 + 0I, 1 + 0I)
对于上述输入(应该是(1,0)
)