【问题标题】:Measure computational complexity of solving a linear system Ax=b by increasing size of A通过增加 A 的大小来测量求解线性系统 Ax=b 的计算复杂度
【发布时间】:2016-02-23 17:23:36
【问题描述】:

我有一个线性方程

Ax=b

其中A是非奇异矩阵N×N,x,b是向量N×1; A,b 给了我想找x

很明显,x 可以通过 x=A^(-1)*b 找到。我想测量N增加时的计算复杂度。

在 MATLAB 中,我使用了代码 x=A\b。我知道 MATLAB 会选择最佳算法来找到解决方案。在分析中,我知道当 N 增加时,计算复杂度会随着 N^3 的增加而增加。当 N 增加时,如何拟合/测量上述方程的模拟和分析之间的计算复杂度?

【问题讨论】:

  • 测量在N 的不同值下运行需要多长时间,将N 和时间量存储在一个数组中,并绘制它们。
  • 查看timeit 以准确测量计算时间
  • 您认为仿真会准确地显示分析结果为N^3吗?因为如果我使用 A\b,MATLAB 会选择最佳算法

标签: algorithm matlab time-complexity


【解决方案1】:

根据linear solver flowchart,对于随机矩阵A = rand(n),求解器将使用LU 分解(本质上是高斯消除),因为所有其他算法都需要某种特殊形式的矩阵。

所需操作的数量为 N^3。但这不会转化为 N^3 运行时间,因为 MATLAB are multithreaded 中的数值线性代数例程。例如,在对某列执行高斯消元时,行操作可以独立执行,因此可以分布在多个线程之间。

这是我如何测试线性求解器的运行时间。矩阵大小为100:10:500。我重复A\b 500 次,使用相同的矩阵(以避免将生成这些矩阵的成本加到总数中)。

sizes = 100:10:500;
tries = 500;
n = numel(sizes);
time = zeros(1, n);
for j = 1:n
    A = rand(sizes(j));
    b = rand(sizes(j), 1);
    tic 
    for k = 1:tries
        x = A\b;
    end
    time(j) = toc;
end
logsize = log(sizes/sizes(1));
logtime = log(time/time(1));
plot(sizes, logtime./logsize);
axis([sizes(1) sizes(end) 0 4])

我没有查看plot(sizes, time) 并试图弄清楚它是三次方还是什么,而是采用对数的比率来直接显示N 的指数。在我的机器上看起来像这样,表明大约 N^2 增长。

(正如 Luis Mendo 所说,使用 timeit 而不是 tic,toc 会更好,但它在我的旧版 MATLAB 中不可用。)

【讨论】:

  • 谢谢莎莉。是否可以打开多线程以适应分析和模拟?
猜你喜欢
  • 1970-01-01
  • 2012-11-24
  • 2016-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多