我正在尝试使用BLAS函数 dgbmv 将矢量乘以带矩阵。我的代码在C中,我使用cblas来调用该函数。
以下是一个例子:
int main(int argc, char **argv)
{
/*Band representation of A = {1.0 1.0 1.0 0.0
2.0 2.0 2.0 2.0
3.0 3.0 3.0 3.0
4.0 4.0 4.0 4.0
0.0 5.0 5.0 5.0 }*/
double A[24]={0.,0.,1.,2.,
0.,1.,2.,3.,
1.,2.,3.,4.,
2.,3.,4.,5.,
3.,4.,5.,0.,
4.,5.,0.,0. };
/* Vectors x and y */
double X[4]={1,2,3,4};
double Y[10]={1,0,2,0,3,0,4,0,5,0};
double alpha=2.;
double beta=10.;
/* Use BLAS to compute y=beta*y+alpha*A*x */
cblas_dgbmv(CblasRowMajor,CblasNoTrans,5,4,3,2,alpha,A,6,X,1,beta,Y,2);
}
此代码给出y = {20.,0.,80。,0.,106。,0。,114。,0.,58。,0。}这是错误的。
但是,如果我使用A的转置并将cblas_dgbmv的第一个参数更改为“CblasColMajor”,我会得到正确的结果:
int main(int argc, char **argv)
{
....
....
double B[24];
/* Set B=transpose(A) */
int l,m;
for (l=0;l<6;l++)
{
for(m=0;m<4;m++)
{
B[6*m+l]=A[l*4+m];
}
}
...
...
cblas_dgbmv(CblasColMajor,CblasNoTrans,5,4,3,2,alpha,B,6,X,1,beta,Y,2);
}
此代码给出y = {22.,0,60。,0.,90。,0.,120。,0.,140。,0。},这是正确的。
我认为这两个代码应该产生相同的结果,因为将矩阵存储格式从行主要格式更改为列式主格式并转置矩阵应该不会产生净效果。
我需要处理大型矩阵,我无法转移所有这些矩阵。此外,我想了解为什么这两个例子给出了不同的结果。