我有一个尺寸为 6x6 的矩阵 M,它的秩为 1。我如何将它分解为两个尺寸为 6x1(比如 A)和 1x6(比如 B)的矩阵,以便 M=A*B。
问问题
1376 次
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 回答