MATLAB:MATLAB 中使用的 qr 算法和 DGEMM 是否考虑输入矩阵是否为三边形并进行相应优化?

计算科学 matlab 矩阵
2021-12-16 21:45:50

假设我们要求解大小为 x的对称矩阵的特征值。nn

在计算的第一阶段,使用 Householder/Arnoldi 的归约将矩阵归约为三边形形式。理论说这是O(n3)

在计算的第 2 阶段,通过使用归一化同时迭代 (NSI)将此三边形形式转换为对角线形式。此迭代中的两个主要步骤是三边矩阵的矩阵乘法和三边矩阵的qr分解。这些中的每一个(如果专门为三边系统实现)将是由于这些要重复次,因此总数将为O(n)nO(n2)

我想通过实验看到阶段 1 实际上减少了计算时间。最简单的方法是在MATLAB中使用DGEMM例程进行矩阵乘法,并使用 Householder 反射器进行qr分解。

我的问题是:MATLAB中使用的qr算法和DGEMM是否考虑输入矩阵是否为三边形并进行相应优化?文档说它区分了稀疏矩阵和密集矩阵。

如果我必须单独编写代码用于三边系统的矩阵乘法和使用户主反射器的qr,它会比MATLAB中提供的代码更好吗?

有没有办法使用 MATLAB 以外的东西来做到这一点,比如 C 或 C++ 库?

1个回答

这是一个简短的 Matlab 基准测试。我使用了稀疏的三对角矩阵。

function benchmark_qr

maxit = 25;
time = zeros(maxit,2);

for iter = 1:maxit

    mdim = 500 * iter;

    A = gallery('tridiag',mdim,-2,3,-2);

    t_start_qr = tic;
    qr(A);
    t_elapsed_qr = toc(t_start_qr);

    t_start_eig = tic;
    eig(A);
    t_elapsed_eig = toc(t_start_eig);

    time(iter,1) = mdim;
    time(iter,2) = t_elapsed_qr;
    time(iter,3) = t_elapsed_eig;

end

figure
loglog(time(:,1),time(:,2),'rs--')
hold on
loglog(time(:,1),time(:,3),'kd--')
loglog(time(:,1),(time(:,1)/100).^2,'--')
loglog(time(:,1),(time(:,1)/100).^3,'-.')
legend('qr','eig','N^2','N^3','Location','northwest');

end

结果表明,对于足够大的eig ,两者和qr都是O(n2)n

在此处输入图像描述