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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何生成随机可逆对称正半定矩阵?相关的知识,希望对你有一定的参考价值。

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

以上是关于如何生成随机可逆对称正半定矩阵?的主要内容,如果未能解决你的问题,请参考以下文章

matlab如何生成对角元素为无穷大,且对称的矩阵

使用已知目标函数实现梯度下降

C语言生成随机可逆方阵

在 Numpy 中生成对称矩阵

MATLAB 生成n阶对称矩阵,其中主对角线元素为0,其他元素为0或1

matlab 怎样生成一个N*N的对称矩阵,要主对角线的元素为0,其他随意?