使用带有 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()
并将结果转置回来。
我们想求解 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()
并将结果转置回来。