使用带有 LAPACKE_sgetrs 的行时,为什么必须 ldb=1(而不是 3,而不是 n)?

When usng rows with LAPACKE_sgetrs, why must ldb=1 (instead of 3, instead of n)?

我们想求解 x 为 Ax=b,

A=
0  2  3
1  1  -1
0  -1  1

b=
13
0
1

x=
1
2
3

下面的程序先写A=P*L*U。它适用于列。它是这样的:

 float a[3*3]={
0,1,0,       
2,1,-1,
3,-1,1
};
  float b[8]={
13,
0,
1  

lapack_int n=3,lda=3,ldb=3,nrhs=1,info,piv[3];

info= LAPACKE_sgetrf(LAPACK_COL_MAJOR,n,n,a,lda,piv);

info= LAPACKE_sgetrs(LAPACK_COL_MAJOR,'N',n,nrhs,a,lda,piv,b,ldb);

这行得通。现在我想用行编程:

 float a[3*3]={
   0,2,3,
   1,1,-1,
   0,-1,1
};
  float b[8]={
13,
0,
1  

lapack_int n=3,lda=3,ldb=1,nrhs=1,info,piv[3];

info= LAPACKE_sgetrf(LAPACK_ROW_MAJOR,n,n,a,lda,piv);

info= LAPACKE_sgetrs(LAPACK_ROW_MAJOR,'N',n,nrhs,a,lda,piv,b,ldb);

我的问题是:为什么必须 ldb=1(而不是 3)?

此行为是由于包装器 LAPACKE 造成的。

如果使用LAPACK_COL_MAJOR,wrapper几乎直接调用LAPACK的sgetrs(),如source of LAPACKE. Hence, the leading dimension ldb of the array b must be equal or higher than the number of rows of the matrix a, that is n=3. Therefore, the requirement is LDB >= max(1,N) as in sgetrs()所示。

另一方面,如果使用 LAPACK_ROW_MAJOR,则 b 被转置。因此,数组的前导维度 ldb 现在与右侧的数量 nrhs=1 相关。现在的要求是 LDB >= max(1,NRHS),正如在 line 59 上测试的那样:if( ldb < nrhs )。然后通过调用LAPACKE_sge_trans对数组b和矩阵进行转置。最后,使用 lbd=n 调用 sgetrs() 并将结果转置回来。