问题描述
我正在使用 Apples Swift / Accelerate 框架编写一些线性代数算法。所有的工作和求解的 Ax = b 方程都产生了正确的结果(此代码来自苹果示例)。
我希望能够从
中提取 LLT 分解Thread t1 = new Thread(() -> {
ServerSocket ss = null;
try {
ss = new ServerSocket(9000);
} catch (IOException e) {
e.printstacktrace();
}
try {
while(true) {
System.out.println("Waiting Transaction ..");
Socket clientSocket = ss.accept();
InetAddress inet = clientSocket.getInetAddress();
try{
while (clientSocket.getInputStream().available() == 0) {
Thread.sleep(100L);
}
byte[] data;
int bytes;
data = new byte[clientSocket.getInputStream().available()];
bytes = clientSocket.getInputStream().read(data,data.length);
String dataDB = new String(data,bytes,"UTF-8");
System.out.println("received data\n time : "+ new Date() +"length data : " + dataDB.length());
System.out.println(dataDB);
String dataFrom = getFromServer(dataDB);
clientSocket.getoutputStream().write(dataFrom.getBytes("UTF-8"));
}catch (BindException be){
be.printstacktrace();
}catch(Exception e){
e.printstacktrace();
}finally {
clientSocket.close();
}
}
} catch (Exception e) {
e.printstacktrace();
} finally {
try {
ss.close();
} catch (IOException e) {
e.printstacktrace();
}
}
});
t1.start();
对象。但是似乎没有任何方法可以提取(打印)因式分解。有人知道从 SparSEOpaqueFactorization_Double 对象中提取分解矩阵的方法吗?
SparSEOpaqueFactorization_Double
解决方法
好的,在对 apple swift 标头进行了大量调查之后,我已经解决了这个问题。
有一个名为 Accelerate API 的调用
public func SparseCreateSubfactor(_ subfactor: SparseSubfactor_t,_ Factor: SparseOpaqueFactorization_Double) -> SparseOpaqueSubfactor_Double
返回此 SparceOpaqueSubfactor_ 类型。这可用于矩阵乘法以产生“透明”结果(即您可以使用/打印/查看的矩阵)。所以我将 Cholesky 分解的下三角部分的 SubFactor 乘以单位矩阵来提取因子。很好用!
let subfactors = SparseCreateSubfactor(SparseSubfactorL,llt)
var identValues = generateIdentity(n)
ppm(identValues)
let sparseAs = SparseAttributes_t(transpose: false,triangle: SparseUpperTriangle,kind: SparseOrdinary,_reserved: 0,_allocatedBySparse: false)
let identity_m = DenseMatrix_Double(rowCount: Int32(n),columnCount: Int32(n),columnStride: Int32(n),attributes: sparseAs,data: &identValues)
SparseMultiply(subfactors,identity_m) // Output is in identity_m after the call
我编写了一个小函数来生成我在上面的代码中使用的单位矩阵:
func generateIdentity(_ dimension: Int) -> [Double] {
var iden = Array<Double>()
for i in 0...dimension - 1 {
for j in 0...dimension - 1 {
if i == j {
iden.append(1.0)
} else {
iden.append(0.0)
}
}
}
return iden
}