linsolve 直接求解器 O(n^2) 的“实际”复杂性是什么?

计算科学 matlab 线性求解器 线性规划
2021-12-20 19:38:34

我最近对 ​​linsolve 直接求解器进行了计时,看到求解器似乎可以二次缩放甚至高达 1000 维,我感到有点震惊。具体来说,我运行了以下代码,它表明所用时间的三次系数a311000a2. 根据我的回忆,三次系数不应该那么小,而是更像110a2. 为什么例行程序这么快?我在一个 5 岁的 macbook pro 上,只有 2 个核心。

clear; close all; clc
pv = [ 10 20 30 40 50 60 70 80 90 100 200 300 400 500 600 700 800 900 1000];
tv = nan(length(pv), 1);
runs=3;
tv2 = nan(length(pv), 1);
for pi = 1:length(pv)
    p = pv(pi);
    v = randn(p, 1);
    m = randn(p, p);
    % Calculate time for mldivide.
    tic; for i = 1:runs mldivide(m, v); end; tv(pi) = toc/runs * 1e9;
    % Calculate time for linsolve.
    tic; for i = 1:runs linsolve(m, v); end; tv2(pi) = toc/runs * 1e9;
end
plot(pv, tv, 'b');
hold on;
plot(pv, tv2, 'r');
ylabel('nano-seconds');
xlabel('dimension');

一只忙碌的猫

1个回答

您的矩阵太小而看不到渐近线O(n3)linsolve 使用的 LU 分解的运行时行为。对于非常小的矩阵,围绕 LU 分解的计算开销将使得很难看到O(n3)生长。此外,MATLAB 通常会使用并行例程来计算 LU 分解,这些例程仅在您尝试过的较小矩阵大小时才开始有效。使用一系列尺寸再次尝试您的演示p=500最多说p=20000看看会发生什么。