如何使用MATLAB生成随机,可逆,对称,正半定矩阵?
我找到了这个Python代码:
matrixSize = 10
A = random.rand(matrixSize,matrixSize)
B = numpy.dot(A,A.transpose())
但我不确定这是否会产生随机正半定义矩阵B
。
MATLAB相当于你的代码是:
matrixSize = 10;
A = rand(matrixSize);
B = A * A.';
这确实产生了对称的正半定基质。但是这个矩阵不一定是可逆的,矩阵是单数的(虽然非常不可能)。更可能的是它几乎是单数,这意味着逆将获得非常大的值。这个逆是不精确的,并且B*inv(B)
将与单位矩阵的差异大于您的容差。
确保B*inv(B)
在单位矩阵容差范围内的一种简单方法是重复生成随机矩阵,直到找到一个好的:
tol = 1e-12;
while true
A = rand(matrixSize);
B = A*A.';
err = abs(B*inv(B) - eye(matrixSize));
if all(err(:)<tol)
break
end
end
上面的循环大部分时间只运行一次,只是偶尔需要生成第二个矩阵。
对于任何eps> 0和任何nxk(对于任何k)矩阵B矩阵
P = eps*I + B*B'
是肯定的和可逆的。如果k <n且eps很小,则P将几乎是单数,在某种意义上它将具有eps作为特征值。在生成这些矩阵以测试某些东西时,能够生成几乎单一的东西会很方便。
获取P
的MATLAB代码:
n = 10;
k = 1;
B = rand(n,k);
B = B * B.';
P = B + eye(size(B)) * eps(max(B(:)));