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



如何使用 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


获取P的 MATLAB 代码:

n = 10;
k = 1;
B = rand(n,k);
B = B * B.';
P = B + eye(size(B)) * eps(max(B(:)));

最新更新