谁能给我一些关于优化我的 Matlab 代码的建议?

计算科学 matlab 矩阵 矩阵分解
2021-11-30 06:38:01

最近,我尝试编写一个 Matlab 代码来实现 M. Benzi 在他的论文http://www.mathcs.emory.edu/~benzi/Web_papers/ainv.pdf中提出的稀疏近似逆分解方法, 该代码生成不完全分解为 我编写了以下代码: 然后这些代码可以运行任何错误。但是,这段代码似乎很昂贵,当我用它来处理一个 2961*2961 的测试矩阵时,它需要一个晚上来产生矩阵A1=ZD1WA1=Z^W在此处输入图像描述在此处输入图像描述在此处输入图像描述WZ. 所以我认为应该优化代码以提高效率。所以我想请人给我一些改进这些代码的建议。我还注意到我的代码中有很多“for-loop”,也许这些“for-loop”可以通过一些策略来替换。到目前为止,我还没有改进此代码的想法,所以我向大家求助。

1个回答

它并不慢,因为您对算法的编码很差,或者因为 Matlab 执行它的速度很慢。算法本身太慢了。我不太确定它的作用,但我可以解释为什么它这么慢。

在您的函数的一部分中,您具有以下代码结构:

for i=1:n
  for j=i+1:n
    for k=1:i
      <body>
    end
  end
end

这个三重嵌套循环执行其主体 次,因此算法的时间复杂度为对于大小为的矩阵,这是单独执行该循环的主体的因此,该算法对于这种大小的矩阵来说过于昂贵。

16n(n21)
O(n3)n=30005×109

至于为什么这个算法有复杂度,我不知道。我真的看不出它在哪里使用稀疏性,因为它访问该循环中的每个元素,尽管以 开头,所以我怀疑它是稀疏的。通常,稀疏矩阵的算法会尝试将操作数保持在之类的值,而不是原始论文是否明确指定了算法,还是具有较低的复杂度?O(n3)wk,jwspeyeO(n)O(n3)O(n3)

如果你用其他循环结构替换 for 循环,迭代次数将保持不变,这不太可能有很大帮助,除非没有其他办法可以做。正确的做法是弄清楚如何将时间复杂度降低(或更低),但这是算法设计的问题,也是与优化 Matlab 代码完全不同的问题。实际利用稀疏性也很重要,我现在不明白这个算法是如何做到的。O(n2)