【问题标题】:How to generate random invertible symmetric positive semidefinite matrix?如何生成随机可逆对称半正定矩阵?
【发布时间】: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


    【解决方案1】:

    您的代码的 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


      获取P的MATLAB代码:

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

      【讨论】:

      • 对不起,我不会说 Matlab
      • 没关系。你介意我用一些 MATLAB 代码编辑你的答案吗?
      • 一点也不,随意。
      猜你喜欢
      • 2015-01-12
      • 1970-01-01
      • 1970-01-01
      • 2012-09-01
      • 2021-01-03
      • 1970-01-01
      • 1970-01-01
      • 2012-02-01
      • 1970-01-01
      相关资源
      最近更新 更多