Converting SuiteSparse.SPQR.QRSparseQ to SparseMatrixCSC?

依然范特西╮ 提交于 2021-01-28 11:17:46

问题


I have this problem that converting the native sparse format for the QR decomposition of a sparse Matrix takes forever. However, I need it in the CSC format to use it for further computations.

using LinearAlgebra, SparseArrays
N = 1000
A = sprand(N,N,1e-4)
@time F = qr(A)
@time F.Q
@time Q_sparse = sparse(F.Q)

0.000420 seconds (1.15 k allocations: 241.017 KiB)
0.000008 seconds (6 allocations: 208 bytes)
6.067351 seconds (2.00 M allocations: 15.140 GiB, 36.25% gc time)

Any suggestions?


回答1:


Okay, I found the problem. For other people trying to do it:

factors = F.Q.factors
τ       = F.Q.τ
Nτ = size(factors)[2]
Isp = sparse(I(N));
@time Q_constr = prod(Isp - factors[:,i]*τ[i]*factors[:,i]' for i in 1:Nτ)
Q_constr ≈ Q_sparse

0.084461 seconds (62.64 k allocations: 3.321 MiB, 18.28% gc time)
true

You see that the method sparse(F.Q) is somehow using the wrong representation. If you construct Q as I did above, it will be considerably faster.



来源:https://stackoverflow.com/questions/63035209/converting-suitesparse-spqr-qrsparseq-to-sparsematrixcsc

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!