如何使用 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(:)));