我广泛使用了朱莉娅的线性方程求解器res = X\b
。由于参数变化,我必须在我的程序中使用它数百万次。这工作正常,因为我使用的是小尺寸(最多30
)。现在我想要分析更大的系统,直到1000
,线性求解器不再有效。
我认为可以解决这个问题。但是我必须说有时我的X矩阵是密集的,有时是稀疏的,所以我需要一些适用于这两种情况的东西。
b
向量是一个全零的向量,除了一个始终为1
的条目(实际上它始终是最后一个条目)。此外,我不需要所有res
向量,只需要它的第一个条目。
答案 0 :(得分:4)
通常当人们谈论加速线性求解器res = X \ b
时,它就是多个b
。但是,由于您的b
没有变化,并且您只是不断更改X
,所以这些技巧都不适用。
从数学的角度来看,加快这一点的唯一方法似乎是确保Julia选择X \ b
的最快解算器,即如果你知道X
是正定的,使用Cholesky等Matlab’s flowcharts来获取用于X \ b
的解算器,对于密集和稀疏X
,它们是可用的 - 很可能Julia也实现了接近这些流程图的东西,但是再一次,也许你可以找到一些简化或快捷方式。
所有与编程相关的加速(多个线程 - 虽然每个单独的解算器可能已经是多线程的,但当每个解算器使用的线程少于核心时,可能值得并行运行多个求解器; @simd
如果你是愿意深入研究解决方案; OpenCL / CUDA库等;然后可以应用。
答案 1 :(得分:4)
如果您的问题的格式为(A - µI)x = b
,其中µ
是变量参数且A
,b
已修复,则可以使用对角化。
设A = PDP°
其中P°
表示P
的倒数。然后(PDP° - µI)x = b
可以转换为
(D - µI)P°x = P°b,
P°x = P°b / (D - µI),
x = P(P°b / (D - µI)).
(/
操作表示由标量Dr - µ
划分各个向量元素。)
对角化A
后,为任何µ
计算解决方案会减少为两个矩阵/矢量积,或者如果您还可以预先计算P°b
,则为单个积分。
数值不稳定性将显示在A
的特征值附近。
答案 2 :(得分:0)
效率的最佳方法是使用:JuliaMath / IterativeSolvers.jl。对于A * x = b
问题,我建议x = lsmr(A, b)
。
第二个最佳替代方案是向编译器提供更多信息:如果Cholesky分解适合您,则执行x = inv(A'A) * A' * b
而不是x = inv(cholfact(A'A)) A' * b
。否则,您可以尝试U, S, Vt = svd(A)
和x = Vt' * diagm(sqrt.(S)) * U' * b
。
不确定x = pinv(A) * b
是否已优化,但效率可能略高于x = A \ b
。