如何生成随机可逆对称正半定矩阵?

问题描述 投票:0回答:2

如何使用MATLAB生成随机,可逆,对称,正半定矩阵?

我找到了这个Python代码:

matrixSize = 10
A = random.rand(matrixSize,matrixSize)
B = numpy.dot(A,A.transpose())

但我不确定这是否会产生随机正半定义矩阵B

matlab matrix random matrix-inverse
2个回答
2
投票

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

上面的循环大部分时间只运行一次,只是偶尔需要生成第二个矩阵。


2
投票

对于任何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(:)));
© www.soinside.com 2019 - 2024. All rights reserved.