I am new to Matlab. I would like to check the so call "logarithmic law" for determinant of random matrices with Matlab, but still do not know how.
Logarithmic law:
Let A be a random Bernoulli matrix (entries are iid, taking value +-1 with prob. 1/2) of size n by n. We may want to compare the probability density function of (log(det(A^2))-log(factorial(n-1)))/sqrt(2n) with the pdf of Gaussian distribution. The logarithmic law says that the pdf of the first will approach to that of the second when n approaches infinity.
My Matlab task is very simple: check the comparison for, say n=100. Anyone knows how to do so?
开发者_JAVA技巧Thanks.
Consider the following experiment:
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)
Note that for large matrices, the determinant of A*A will be too large to represent in double numbers and will return Inf
. However we only require the log of the determinant, and there exist other approachs to find this result that keeps the computation in log-scale.
In the comments, @yoda suggested using the eigenvalues detA2(i) = real(sum(log(eig(A^2))));
, I also found a submission on FEX that have a similar implementation (using LU or Cholesky decomposition)
精彩评论