【发布时间】:2013-04-08 23:54:11
【问题描述】:
我有一个尺寸为 6x6 的矩阵 M,它的秩为 1。如何将其分解为两个尺寸为 6x1(例如 A)和 1x6(例如 B)的矩阵,以便 M=A*B。
【问题讨论】:
标签: matlab factorization
我有一个尺寸为 6x6 的矩阵 M,它的秩为 1。如何将其分解为两个尺寸为 6x1(例如 A)和 1x6(例如 B)的矩阵,以便 M=A*B。
【问题讨论】:
标签: matlab factorization
取最大特征向量乘以最大特征值:
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)
它会产生完全不同的结果,但这仍然会分解矩阵。如果您希望非负分解只是为了稍微减少可能结果的空间,我建议您提出一个新问题!
【讨论】:
如果它的排名为 1,则所有列/行都是第一列/行的倍数(或者实际上是任何非零列/行的倍数)。即:
m = M(:,1);
M = [ a*m, b*m, c*m, d*m, e*m, f*m ];
希望你能从那里拿走它。
【讨论】:
a 始终是1。 b 必须是什么才能正确生成 M 的第二列?