我是Matlab的新手。我想用Matlab检查所谓的“对数定律”,以确定随机矩阵,但仍然不知道如何。
对数定律:
设A是一个随机伯努利矩阵(条目是iid,取值+ -1,大概为1/2),大小为n乘n。我们可能想要将(log(det(A ^ 2)) - log(factorial(n-1)))/ sqrt(2n)的概率密度函数与高斯分布的pdf进行比较。对数定律表明,当n接近无穷大时,第一个的pdf将接近第二个的pdf。
我的Matlab任务非常简单:检查比较,比如说n = 100。谁知道怎么做?
感谢。
答案 0 :(得分:5)
考虑以下实验:
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上找到了一个具有类似实现的submission(使用LU或Cholesky分解)