用于计算矩阵行列式的最快算法?

时间:2014-11-18 20:07:11

标签: algorithm matrix complexity-theory linear-algebra determinants

对于一篇研究论文,我被指派研究用于计算矩阵行列式的最快算法。

我已经知道 LU分解 Bareiss算法这些都在O(n ^ 3)中运行,但在做了一些挖掘后,似乎有一些算法可以在n ^ 2和n ^ 3之间运行。

source(参见第113-114页)和此source(参见第198页)表示存在一个在O(n ^ 2.376)中运行的算法,因为它基于Coppersmith-用于乘法矩阵的Winograd算法。但是,我还没有找到关于这种算法的任何细节。

我的问题是:

  1. 用于计算矩阵行列式的最快创建(非理论)算法是什么?
  2. 在哪里可以找到有关此最快算法的信息?
  3. 非常感谢。

4 个答案:

答案 0 :(得分:5)

我认为最快的实践(和常用)算法是Strassen算法。您可以在Wikipedia上找到解释以及示例C代码。

基于Coppersmith-Winograd's multiplication algorithms的算法过于复杂而不实用,尽管它们具有迄今为止最好的渐近复杂度。

答案 1 :(得分:2)

我知道这不是我问题的直接答案,但为了完成我的研究论文,这就足够了。 我刚结束问我的教授,我将总结他说的话:

摘要:

  • 最快的矩阵乘法算法(例如,Coppersmith-Winograd和更近期的改进)可以与O(n ^ ~2.376)算术运算一起使用,但是使用繁重的数学工具并且通常是不切实际的。
  • LU Decomposition和Bareiss确实使用O(n ^ 3)操作,但更实用

简而言之,即使LU Decomposition和Bareiss没有最有效的算法那么快,它们也更实用,我应该把我的研究论文集中在这两个上。

感谢所有评论和帮助的人!

答案 2 :(得分:0)

参见下面的Matlab测试脚本,它计算任意平方矩阵的决定因素(还包括与Matlab的内置函数的比较):

nMin = 2;  % Start with 2-by-2 matrices
nMax = 50; % Quit with 50-by-50 matrices
nTests = 10000;
detsOfL = NaN*zeros(nTests, nMax - nMin + 1);
detsOfA = NaN*zeros(nTests, nMax - nMin + 1);
disp(' ');
for n = nMin:nMax
    tStart = tic;
    for j = 1:nTests
       A = randn(n, n);
       detA1 = det(A); % Matlab's built-in function
       if n == 1
           detsOfL(j, 1) = 1;
           detsOfA(j, 1) = A;
           continue; % Trivial case => Quick return
       end
       [L, U, P] = lu(A);
       PtL = P'*L;
       realEigenvaluesOfPtL = real(eig(PtL));
       if min(prod(realEigenvaluesOfPtL)) < 0 % det(L) is always +1 or -1
           detL = -1;
       else
           detL = 1;
       end
       detU = prod(diag(U));
       detA2 = detL * detU; % Determinant of A using LU decomposition
       if detA1 ~= detA2
           error(['Determinant computation failed at n = ' num2str(n) ', j = ' num2str(j)]);
       end
       detsOfL(j, n - nMin + 1) = detL;
       detsOfA(j, n - nMin + 1) = detA2;
    end
    tElapsed = toc(tStart);
    disp(sprintf('Determinant computation was successful for n = %d!! Elapsed time was %.3f seconds', n, tElapsed));
end
disp(' ');

答案 3 :(得分:0)

请参考基于Saruss规则的nxn行列式解技术 https://github.com/apanasara/Faster_nxn_Determinant