【问题标题】:Partition a positive definite square matrix into two identical matrix将一个正定方阵划分为两个相同的矩阵
【发布时间】:2012-05-16 06:32:15
【问题描述】:

我只想将n*n 正定矩阵划分为相同的n*r 矩阵B,其中r 是任意的,换句话说:

B*B^T=A
(n*r)*(n*r)^T=(n*n)

编辑: 我认为这是我的错,无法描述我的问题。 让B 是一个维度为(n*r) 的矩阵。 给它一个函数A=f(B^T*B),其中A是(n*n)。 我知道这个函数会保持矩阵的秩,换句话说rank(A)=rank(B'*B)。 现在我想提取新的B。所以新的B 又是(n*r)

【问题讨论】:

  • "低维度" "r 是任意的" - 根据您的标题,r 不是任意的; r

标签: matlab matrix decomposition


【解决方案1】:

假设您有以下示例:

n = 4;
rng(0)
A = rand(n,n);
B = A * A';

如果矩阵B 是满秩的,你不能用更少的维度完全覆盖原始矩阵。所以,你只能近似。这里的关键思想是最小化重建误差。

您可以使用eigenvalue decompositionB 分解为其特征向量。您可以在 MATLAB 中使用eig,但之后需要对特征值和对应的特征向量进行排序。相反,我更喜欢 Singular Value Decomposition 并在 MATLAB 中使用 svd。请注意,SVD 给出了低秩矩阵逼近中重构误差的最优解。

[U,S,~] = svd(B);
U = U * sqrt(S);

我们现在知道B = U * U'。见 SVD 与特征值分解的关系here

正如我所说,我们需要对其进行近似。我选择覆盖总方差 99% 的维度如下:

coverage =  cumsum(diag(S.^2));
coverage = coverage ./ norm(S,'fro')^2;
[~, nEig] = max(coverage > 0.99);
U2 = U(:,1:nEig);

在这种情况下,U2 有 2 列而不是 4 列。如果数据是相关的,那么收益会更少。结果如下:

B
B1 = U*U'
B2 = U2*U2'

B =

    2.8966    2.1881    1.1965    2.1551
    2.1881    1.9966    0.6827    1.8861
    1.1965    0.6827    0.7590    0.5348
    2.1551    1.8861    0.5348    2.0955


B1 =

    2.8966    2.1881    1.1965    2.1551
    2.1881    1.9966    0.6827    1.8861
    1.1965    0.6827    0.7590    0.5348
    2.1551    1.8861    0.5348    2.0955


B2 =

    2.8896    2.2134    1.1966    2.1385
    2.2134    1.9018    0.6836    1.9495
    1.1966    0.6836    0.7586    0.5339
    2.1385    1.9495    0.5339    2.0528

这似乎是一个很好的近似值。

【讨论】:

  • 嗯,这是一个很好的答案,但正如我所说,我需要任意的 r,这个解决方案总是给我 r=4。
  • 不,它会为您提供所需的。检查U2 的尺寸。 nEig 是您需要更改的那个。如果你喜欢,你可以手动设置。
  • 抱歉对 petrichor 的理解有误。
  • 很好,因为在迭代中 r 的值会增加。现在当 r 大于 n 时,我被卡住了。即使有证据表明它不能完成,我也会很高兴知道它。很抱歉这个问题变得冗长。
  • 好的,非常感谢 petrichor 抽出宝贵时间。我非常感谢它
猜你喜欢
  • 2018-01-09
  • 1970-01-01
  • 1970-01-01
  • 2018-05-07
  • 2015-07-29
  • 2023-03-21
  • 2021-08-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多