Рассмотрим следующий эксперимент:
n = 100; %# matrix size
num = 1000; %# number of matrices to generate
detA2ln = zeros(num,1);
for i=1:num
A = randi([0 1],[n n])*2 - 1; %# -1,+1
detA2ln(i) = log(det(A^2));
end
%# `gammaln(n)` is more accurate than `log(factorial(n-1))`
myPDF = ( detA2ln - gammaln(n) ) ./ sqrt(2*log(n));
normplot(myPDF)

Обратите внимание, что для больших матриц определитель A * A будет слишком большим для представления в двойных числах и вернетInf
.Однако нам требуется только лог определителя, и существуют другие подходы, чтобы найти этот результат, который сохраняет вычисления в лог-масштабе.
В комментариях @yoda предложила использовать собственные значения detA2(i) = real(sum(log(eig(A^2))));
, я такженашел представление на FEX, которое имеет аналогичную реализацию (с использованием LU или разложения Холецкого)