最近,我尝试编写一个 Matlab 代码来实现 M. Benzi 在他的论文http://www.mathcs.emory.edu/~benzi/Web_papers/ainv.pdf中提出的稀疏近似逆分解方法,
该代码生成不完全分解为
或。我编写了以下代码:
然后这些代码可以运行任何错误。但是,这段代码似乎很昂贵,当我用它来处理一个 2961*2961 的测试矩阵时,它需要一个晚上来产生矩阵和. 所以我认为应该优化代码以提高效率。所以我想请人给我一些改进这些代码的建议。我还注意到我的代码中有很多“for-loop”,也许这些“for-loop”可以通过一些策略来替换。到目前为止,我还没有改进此代码的想法,所以我向大家求助。
谁能给我一些关于优化我的 Matlab 代码的建议?
计算科学
matlab
矩阵
矩阵分解
2021-11-30 06:38:01
1个回答
它并不慢,因为您对算法的编码很差,或者因为 Matlab 执行它的速度很慢。算法本身太慢了。我不太确定它的作用,但我可以解释为什么它这么慢。
在您的函数的一部分中,您具有以下代码结构:
for i=1:n
for j=i+1:n
for k=1:i
<body>
end
end
end
这个三重嵌套循环执行其主体 次,因此算法的时间复杂度为。对于大小为的矩阵,这是单独执行该循环的主体的因此,该算法对于这种大小的矩阵来说过于昂贵。
至于为什么这个算法有复杂度,我不知道。我真的看不出它在哪里使用稀疏性,因为它访问该循环中的每个元素,尽管以 开头,所以我怀疑它是稀疏的。通常,稀疏矩阵的算法会尝试将操作数保持在之类的值,而不是。原始论文是否明确指定了算法,还是具有较低的复杂度?speye
如果你用其他循环结构替换 for 循环,迭代次数将保持不变,这不太可能有很大帮助,除非没有其他办法可以做。正确的做法是弄清楚如何将时间复杂度降低(或更低),但这是算法设计的问题,也是与优化 Matlab 代码完全不同的问题。实际利用稀疏性也很重要,我现在不明白这个算法是如何做到的。
其它你可能感兴趣的问题