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

时间:2017-06-28 09:57:47

标签: lapack

我们想要解决Ax = b,

的x
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)?

1 个答案:

答案 0 :(得分:1)

此行为是由包装器LAPACKE引起的。

如果使用LAPACK_COL_MAJOR,则包装器几乎直接调用LAPACK的sgetrs(),如source of LAPACKE所示。因此,数组ldb的前导维b必须等于或高于矩阵a的行数,即n=3。因此,LDB >= max(1,N)中的要求为LAPACK_ROW_MAJOR

另一方面,如果使用bldb会被转置。因此,数组nrhs=1的前导维度现在与右侧数LDB >= max(1,NRHS)相关。现在,sgetrs()if( ldb < nrhs )对该要求进行了b测试。然后通过调用LAPACKE_sge_trans来转置数组sgetrs()和矩阵。最后,使用lbd=n调用class Court { var AnzahlToreKoerbe: String? var Breitengrad: String? var Groesse: String? var Hochgeladen: String? var Laengengrad: String? var Stadt: String? var Stadtteil: String? var Strasse: String? var Untergrund: String? var Upload_Zeitpunkt: Int? var Platzart: String? init(AnzahlToreKoerbeString: String, BreitengradString: String, GroesseString: String, HochgeladenString: String, LaengengradString: String, StadtString: String, StadtteilString: String, StrasseString: String, UntergrundString: String, UploadTime: Int, PlatzartString: String) { AnzahlToreKoerbe = AnzahlToreKoerbeString Breitengrad = BreitengradString Groesse = GroesseString Hochgeladen = HochgeladenString Laengengrad = LaengengradString Stadt = StadtString Stadtteil = StadtteilString Strasse = StrasseString Untergrund = UntergrundString Upload_Zeitpunkt = UploadTime Platzart = PlatzartString } ,并将结果转换回来。