b********r 发帖数: 1080 | 1 我用atlas,程序里简单调用zgeev函数。编译没有错,没有警告。运行也不出错,但结
果完全不对。似乎函数根本没有被调用。
另外哪里能找到在C或者C++下调用Blas/Lapack函数的具体格式?我这里函数参数还是
在网上搜的。完全没有相关的手册。难道Blas/Lapack只是给fortran用的?
程序如下
#include
#include
#include
#include
#include
using namespace std;
typedef complex dcomplex;
extern "C" void zgeev_( char* jobvl, char* jobvr, int* n, dcomplex* a,
int* lda, dcomplex* w, dcomplex* vl, int* ldvl, dcomplex*
vr, int* ldvr, dcomplex* work, int* lwork, double* rwork, int* info );
int main()
{
/* Locals */
int N=4;
int LDVL=N,LDVR=N,LDA=N;
int n = N, lda = N, ldvl = LDVL, ldvr = LDVR, info, lwork;
cout<
dcomplex wkopt;
dcomplex* work;
/* Local arrays */
/* rwork dimension should be at least 2*n */
double rwork[2*N];
dcomplex w[N], vl[LDVL*N], vr[LDVR*N];
dcomplex a[16] = {
(-3.84, 2.25), (-0.66, 0.83), (-3.99, -4.73), ( 7.74, 4.18),
(-8.94, -4.75), (-4.40, -3.82), (-5.88, -6.60), ( 3.66, -7.53),
( 8.95, -6.53), (-3.50, -4.26), (-3.36, -0.40), ( 2.58, 3.60),
(-9.87, 4.82), (-3.15, 7.36), (-0.75, 5.23), ( 4.59, 5.41)};
lwork = -1;
char jobvl='V',jobvr='N';
zgeev_(&jobvl, &jobvr, &n, a, &lda, w, vl, &ldvl, vr, &ldvr, &wkopt,
&lwork, rwork, &info );
cout<<"w="<
}
输出结果是
w=(0,0)(0,0)(0,0)(0,0)
问题出在哪里呢?谢谢! | x*****u 发帖数: 3419 | 2 This is one I had that works:
/*
to compile :
$ gcc array_lapack.c -llapack -lblas -lm
*/
#include
#include
#define size 3 /* dimension of matrix */
struct complex {double re; double im;}; /* a complex number */
main()
{
struct complex A[3][3], b[3], WORK[6], RWORK[6];
struct complex w[3], vl[1][3], vr[1][3];
double AT[2*size*size]; /* for transformed matrix */
int i, j, ok;
char jobvl, jobvr;
int n, lda, ldvl, ldvr, lwork;
n=size;
jobvl='N';
jobvr='N';
lda=size;
ldvl=1;
ldvr=1;
lwork=6;
A[0][0].re=3.1;A[0][0].im=-1.8; /* the input matrix */
A[0][1].re=1.3;A[0][1].im=0.2;
A[0][2].re=-5.7;A[0][2].im=-4.3;
A[1][0].re=1.0;A[1][0].im=0;
A[1][1].re=-6.9;A[1][1].im=3.2;
A[1][2].re=5.8;A[1][2].im=2.2;
A[2][0].re=3.4;A[2][0].im=-4;
A[2][1].re=7.2;A[2][1].im=2.9;
A[2][2].re=-8.8;A[2][2].im=3.2;
for (i=0; i
{ /* have to transform the matrix */
for(j=0; j
{
AT[2*(j+size*i)]=A[j][i].re;
AT[2*(j+size*i)+1]=A[j][i].im;
}
}
/* find solution using LAPACK routine ZGEEV, all the non-array arguments
have to be pointers */
zgeev_(&jobvl, &jobvr,&n, AT, &lda, w, vl, &ldvl, vr, &ldvr, WORK, &lwork,
RWORK, &ok);
if (ok==0) /* output of eigenvalues */
{
for (i=0; i
{
printf("%f\t%f\n", w[i].re, w[i].im);
}
}
else printf("An error occurred");
}
【在 b********r 的大作中提到】 : 我用atlas,程序里简单调用zgeev函数。编译没有错,没有警告。运行也不出错,但结 : 果完全不对。似乎函数根本没有被调用。 : 另外哪里能找到在C或者C++下调用Blas/Lapack函数的具体格式?我这里函数参数还是 : 在网上搜的。完全没有相关的手册。难道Blas/Lapack只是给fortran用的? : 程序如下 : #include : #include : #include : #include : #include
| l********a 发帖数: 1154 | 3 c interface of blas
http://netlib.org/blas/blast-forum/cinterface.pdf
【在 b********r 的大作中提到】 : 我用atlas,程序里简单调用zgeev函数。编译没有错,没有警告。运行也不出错,但结 : 果完全不对。似乎函数根本没有被调用。 : 另外哪里能找到在C或者C++下调用Blas/Lapack函数的具体格式?我这里函数参数还是 : 在网上搜的。完全没有相关的手册。难道Blas/Lapack只是给fortran用的? : 程序如下 : #include : #include : #include : #include : #include
| j**u 发帖数: 6059 | 4 像我一样只用GSL包打天下的算不算特懒的人,:-)
【在 l********a 的大作中提到】 : c interface of blas : http://netlib.org/blas/blast-forum/cinterface.pdf
| b********r 发帖数: 1080 | 5 我用atlas,程序里简单调用zgeev函数。编译没有错,没有警告。运行也不出错,但结
果完全不对。似乎函数根本没有被调用。
另外哪里能找到在C或者C++下调用Blas/Lapack函数的具体格式?我这里函数参数还是
在网上搜的。完全没有相关的手册。难道Blas/Lapack只是给fortran用的?
程序如下
#include
#include
#include
#include
#include
using namespace std;
typedef complex dcomplex;
extern "C" void zgeev_( char* jobvl, char* jobvr, int* n, dcomplex* a,
int* lda, dcomplex* w, dcomplex* vl, int* ldvl, dcomplex*
vr, int* ldvr, dcomplex* work, int* lwork, double* rwork, int* info );
int main()
{
/* Locals */
int N=4;
int LDVL=N,LDVR=N,LDA=N;
int n = N, lda = N, ldvl = LDVL, ldvr = LDVR, info, lwork;
cout<
dcomplex wkopt;
dcomplex* work;
/* Local arrays */
/* rwork dimension should be at least 2*n */
double rwork[2*N];
dcomplex w[N], vl[LDVL*N], vr[LDVR*N];
dcomplex a[16] = {
(-3.84, 2.25), (-0.66, 0.83), (-3.99, -4.73), ( 7.74, 4.18),
(-8.94, -4.75), (-4.40, -3.82), (-5.88, -6.60), ( 3.66, -7.53),
( 8.95, -6.53), (-3.50, -4.26), (-3.36, -0.40), ( 2.58, 3.60),
(-9.87, 4.82), (-3.15, 7.36), (-0.75, 5.23), ( 4.59, 5.41)};
lwork = -1;
char jobvl='V',jobvr='N';
zgeev_(&jobvl, &jobvr, &n, a, &lda, w, vl, &ldvl, vr, &ldvr, &wkopt,
&lwork, rwork, &info );
cout<<"w="<
}
输出结果是
w=(0,0)(0,0)(0,0)(0,0)
问题出在哪里呢?谢谢! | x*****u 发帖数: 3419 | 6 This is one I had that works:
/*
to compile :
$ gcc array_lapack.c -llapack -lblas -lm
*/
#include
#include
#define size 3 /* dimension of matrix */
struct complex {double re; double im;}; /* a complex number */
main()
{
struct complex A[3][3], b[3], WORK[6], RWORK[6];
struct complex w[3], vl[1][3], vr[1][3];
double AT[2*size*size]; /* for transformed matrix */
int i, j, ok;
char jobvl, jobvr;
int n, lda, ldvl, ldvr, lwork;
n=size;
jobvl='N';
jobvr='N';
lda=size;
ldvl=1;
ldvr=1;
lwork=6;
A[0][0].re=3.1;A[0][0].im=-1.8; /* the input matrix */
A[0][1].re=1.3;A[0][1].im=0.2;
A[0][2].re=-5.7;A[0][2].im=-4.3;
A[1][0].re=1.0;A[1][0].im=0;
A[1][1].re=-6.9;A[1][1].im=3.2;
A[1][2].re=5.8;A[1][2].im=2.2;
A[2][0].re=3.4;A[2][0].im=-4;
A[2][1].re=7.2;A[2][1].im=2.9;
A[2][2].re=-8.8;A[2][2].im=3.2;
for (i=0; i
{ /* have to transform the matrix */
for(j=0; j
{
AT[2*(j+size*i)]=A[j][i].re;
AT[2*(j+size*i)+1]=A[j][i].im;
}
}
/* find solution using LAPACK routine ZGEEV, all the non-array arguments
have to be pointers */
zgeev_(&jobvl, &jobvr,&n, AT, &lda, w, vl, &ldvl, vr, &ldvr, WORK, &lwork,
RWORK, &ok);
if (ok==0) /* output of eigenvalues */
{
for (i=0; i
{
printf("%f\t%f\n", w[i].re, w[i].im);
}
}
else printf("An error occurred");
}
【在 b********r 的大作中提到】 : 我用atlas,程序里简单调用zgeev函数。编译没有错,没有警告。运行也不出错,但结 : 果完全不对。似乎函数根本没有被调用。 : 另外哪里能找到在C或者C++下调用Blas/Lapack函数的具体格式?我这里函数参数还是 : 在网上搜的。完全没有相关的手册。难道Blas/Lapack只是给fortran用的? : 程序如下 : #include : #include : #include : #include : #include
| l********a 发帖数: 1154 | 7 c interface of blas
http://netlib.org/blas/blast-forum/cinterface.pdf
【在 b********r 的大作中提到】 : 我用atlas,程序里简单调用zgeev函数。编译没有错,没有警告。运行也不出错,但结 : 果完全不对。似乎函数根本没有被调用。 : 另外哪里能找到在C或者C++下调用Blas/Lapack函数的具体格式?我这里函数参数还是 : 在网上搜的。完全没有相关的手册。难道Blas/Lapack只是给fortran用的? : 程序如下 : #include : #include : #include : #include : #include
| j**u 发帖数: 6059 | 8 像我一样只用GSL包打天下的算不算特懒的人,:-)
【在 l********a 的大作中提到】 : c interface of blas : http://netlib.org/blas/blast-forum/cinterface.pdf
| d***q 发帖数: 1119 | 9 对规模大一些的计算
gsl 性能如何?
【在 j**u 的大作中提到】 : 像我一样只用GSL包打天下的算不算特懒的人,:-)
| j**u 发帖数: 6059 | 10 我一般最多用27个core,没有觉得gsl有什么不好。gsl其实包含了c的blas,因为大部
分常用函数都有,所以非常方便。
【在 d***q 的大作中提到】 : 对规模大一些的计算 : gsl 性能如何?
| d***q 发帖数: 1119 | |
|