【发布时间】:2014-03-20 17:59:04
【问题描述】:
我正在尝试编译此处找到的示例:
http://www.netlib.org/lapack/lapacke.html#_examples
具体来说,我正在尝试让“调用 CGEQRF 和 CBLAS”示例正常工作。代码是这样的:
#include <stdio.h>
#include <stdlib.h>
#include <lapacke.h>
#include <cblas.h>
int main (int argc, const char * argv[])
{
lapack_complex_float *a,*tau,*r,one,zero;
lapack_int info,m,n,lda;
int i,j;
float err=0.0;
m = 10; n = 5; lda = m;
one = lapack_make_complex_float(1.0,0.0);
zero= lapack_make_complex_float(0.0,0.0);
a = calloc(m*n,sizeof(lapack_complex_float));
r = calloc(n*n,sizeof(lapack_complex_float));
tau = calloc(m,sizeof(lapack_complex_float));
for(j=0;j<n;j++)
for(i=0;i<m;i++)
a[i+j*m] = lapack_make_complex_float(i+1,j+1);
info = LAPACKE_cgeqrf(LAPACK_COL_MAJOR,m,n,a,lda,tau);
info = LAPACKE_cungqr(LAPACK_COL_MAJOR,m,n,n,a,lda,tau);
for(j=0;j<n;j++)
for(i=0;i<n;i++)
r[i+j*n]=(i==j)?-one:zero;
cblas_cgemm(CblasColMajor,CblasConjTrans,CblasNoTrans,
n,n,m,&one,a,lda,a,lda,&one,r,n );
for(i=0;i<n;i++)
for(j=0;j<n;j++)
err=MAX(err,cabs(r[i+j*n]));
printf("error=%e\n",err);
free(tau);
free(r);
free(a);
return(info);
}
如果我将文件保存为 .cpp(也许这是我的第一个错误?)并使用
进行编译g++ lapacketest.cpp -llapack
我得到以下编译错误:
3_20_2.cpp:14:7:错误:从不兼容的类型“void *”分配给“_Complex float *” a = calloc(m*n,sizeof(lapack_complex_float)); ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3_20_2.cpp:15:7:错误:从不兼容的类型“void *”分配给“_Complex float *” r = calloc(n*n,sizeof(lapack_complex_float)); ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3_20_2.cpp:16:9:错误:从不兼容的类型“void *”分配给“_Complex float *” tau = calloc(m,sizeof(lapack_complex_float)); ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3_20_2.cpp:29:25:错误:使用未声明的标识符“cabs” 错误=MAX(错误,cabs(r[i+j*n]));
我尝试更改为 .c 并使用 gcc 进行编译,但出现了其他奇怪的错误。有什么想法吗?我正在慢慢尝试从 Matlab 过渡到 c++ 以进行科学计算,到目前为止,这只是一个令人头疼的问题。
【问题讨论】: