我们想要解决Ax = b,
的xA=
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)?
答案 0 :(得分:1)
此行为是由包装器LAPACKE引起的。
如果使用LAPACK_COL_MAJOR
,则包装器几乎直接调用LAPACK的sgetrs()
,如source of LAPACKE所示。因此,数组ldb
的前导维b
必须等于或高于矩阵a
的行数,即n=3
。因此,LDB >= max(1,N)
中的要求为LAPACK_ROW_MAJOR
。
另一方面,如果使用b
,ldb
会被转置。因此,数组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
}
,并将结果转换回来。