我有一个线性方程式
*
其中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增加时,如何在上述方程的模拟和分析之间拟合/测量计算复杂度?
答案 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增长。
(正如路易斯·门多指出的那样,使用timeit
代替tic
,toc
会更好,但在我的旧版MATLAB中无法使用。)