将正定方阵分成两个相同的矩阵

时间:2012-05-16 06:32:16

标签: matlab matrix decomposition

我想将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)

1 个答案:

答案 0 :(得分:3)

假设您有以下示例:

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

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