Algorithm 通过增加a的大小来测量求解线性系统Ax=b的计算复杂度
我有一个线性方程Algorithm 通过增加a的大小来测量求解线性系统Ax=b的计算复杂度,algorithm,matlab,time-complexity,Algorithm,Matlab,Time Complexity,我有一个线性方程 Ax=b 其中A是非奇异矩阵N×N,而x,b是向量N×1A,b已给出,我想找到x 很明显,x可以通过x=A找到^(−1) *b。我想测量N增加时的计算复杂性 在MATLAB中,我使用了代码x=A\b。我知道MATLAB会选择一个最好的算法来找到解决方案。在分析中,我知道当N增加时,计算复杂度随着N^3的增加而增加。当N增加时,如何拟合/测量上述方程的模拟和分析之间的计算复杂性 根据,对于随机矩阵A=rand(n)解算器将使用LU分解(基本上是高斯消去法),因为所有其他算法都需
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增加时,如何拟合/测量上述方程的模拟和分析之间的计算复杂性 根据,对于随机矩阵A=rand(n)
解算器将使用LU分解(基本上是高斯消去法),因为所有其他算法都需要某种特殊形式的矩阵
所需操作的计数顺序为N^3。但这并不能转化为N^3的运行时间,因为MATLAB中的数值线性代数例程。例如,当对某些列执行高斯消去时,行操作可以独立执行,因此可以分布在多个线程之间
下面是我如何测试线性解算器的运行时间。矩阵大小为100:10:500
。我用相同的矩阵重复了A\b
500次(以避免将生成这些矩阵的成本加到总数中)
我没有查看绘图(大小、时间)
并试图找出它是三次曲线还是什么,而是取对数的比率,直接表示N的指数。在我的机器上看起来是这样的,表明大约有N^2的增长
(正如Luis Mendo所指出的,使用
timeit
而不是tic
,toc
会更好,但在我的旧版MATLAB中不可用。)测量在不同的N
值下运行所需的时间,存储N
以及数组中的时间量,为了精确测量计算时间,你认为模拟会准确地显示分析结果为N^3吗?因为如果我使用Hank Sally,MATLAB会选择最好的算法。是否可以将多线程转换为适合分析和模拟?
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])