对于一篇研究论文,我被指派研究用于计算矩阵行列式的最快算法。
我已经知道 LU分解和 Bareiss算法这些都在O(n ^ 3)中运行,但在做了一些挖掘后,似乎有一些算法可以在n ^ 2和n ^ 3之间运行。
此source(参见第113-114页)和此source(参见第198页)表示存在一个在O(n ^ 2.376)中运行的算法,因为它基于Coppersmith-用于乘法矩阵的Winograd算法。但是,我还没有找到关于这种算法的任何细节。
我的问题是:
非常感谢。
答案 0 :(得分:5)
我认为最快的实践(和常用)算法是Strassen算法。您可以在Wikipedia上找到解释以及示例C代码。
基于Coppersmith-Winograd's multiplication algorithms的算法过于复杂而不实用,尽管它们具有迄今为止最好的渐近复杂度。
答案 1 :(得分:2)
我知道这不是我问题的直接答案,但为了完成我的研究论文,这就足够了。 我刚结束问我的教授,我将总结他说的话:
摘要:
简而言之,即使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