使用 Accelerate 从 SparseOpaqueFactorization 中获取/提取因式分解

问题描述

我正在使用 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
}