1

我有一个尺寸为 6x6 的矩阵 M,它的秩为 1。我如何将它分解为两个尺寸为 6x1(比如 A)和 1x6(比如 B)的矩阵,以便 M=A*B。

4

2 回答 2

1

取最大的特征向量并乘以最大的特征值:

 A=[1 2 3 4]'*[1 2 3 4]
 A =

     1     2     3     4
     2     4     6     8
     3     6     9    12
     4     8    12    16

 [v,e] = eigs(A,1);
 sqrt(e)*v
 ans =

   -1.0000
   -2.0000
   -3.0000
   -4.0000

当然,结果是好的只有一个标志的变化。

编辑:如果您假设这两个向量可以不同:

A=[1 2 3 4]'*[5 6 7 8]
[uu,ss,vv]=svd(A);
u=uu(:,1)*ss(1,1)
v=vv(:,1)
assert(norm(u*v'-A)<1E-10)

现在解决方案更不独特了。您仅根据 n 确定 2*n 值。这是众多解决方案中的一种。

例如,查看另一个更简单的解决方案(假设您的矩阵完全排名 1):

aa=A(:,:)./repmat(A(1,:),[size(A,1),1]);
bb=A(:,:)./repmat(A(:,1),[1,size(A,2)]);
u=aa(:,1);
v=bb(1,:)'*A(1);
assert(norm(u*v'-A)<1E-10)

它会产生完全不同的结果,但这仍然会分解矩阵。如果您只想进行非负分解以稍微减少可能结果的空间,我建议您提出一个新问题!

于 2013-04-09T05:16:29.763 回答
0

如果它的等级为 1,则所有列/行都是第一列/行的倍数(或者实际上是任何非零列/行的倍数)。IE:

m = M(:,1);
M = [ a*m, b*m, c*m, d*m, e*m, f*m ];

希望你能从那里拿走它。

于 2013-04-08T23:57:17.547 回答