通过增加A的大小来测量求解线性系统Ax = b的计算复杂度

时间:2016-02-23 17:23:36

标签: algorithm matlab time-complexity

我有一个线性方程式

*

其中SELECT count(*) WHERE keyword='keyword' AND time>A AND time<B; SELECT count(*) WHERE keyword='keyword' AND type>B AND time<C; SELECT count(*) WHERE keyword='keyword' AND type>C AND time<D; SELECT count(*) WHERE keyword='keyword' AND type>D AND time<E; 是非奇异矩阵Ax=b ,而A是向量N×N; x,b被给出,我想找到x

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

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

1 个答案:

答案 0 :(得分: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增长。

order

(正如路易斯·门多指出的那样,使用timeit代替tictoc会更好,但在我的旧版MATLAB中无法使用。)