【发布时间】:2019-02-09 03:59:13
【问题描述】:
如何使用 MATLAB 生成随机、可逆、对称、半正定矩阵?
我找到了这个 Python 代码:
matrixSize = 10
A = random.rand(matrixSize,matrixSize)
B = numpy.dot(A,A.transpose())
但我不确定这是否会生成随机正半定义矩阵B。
【问题讨论】:
标签: matlab matrix random matrix-inverse
如何使用 MATLAB 生成随机、可逆、对称、半正定矩阵?
我找到了这个 Python 代码:
matrixSize = 10
A = random.rand(matrixSize,matrixSize)
B = numpy.dot(A,A.transpose())
但我不确定这是否会生成随机正半定义矩阵B。
【问题讨论】:
标签: matlab matrix random matrix-inverse
您的代码的 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(:)));
【讨论】: