【问题标题】:How to do rank-1 factorization in MATLAB?如何在 MATLAB 中进行 rank-1 分解?
【发布时间】:2013-04-08 23:54:11
【问题描述】:

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

【问题讨论】:

    标签: matlab factorization


    【解决方案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)
    

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

    【讨论】:

    • 你假设对于 M=A*B, A=B',这不是我想要的。
    • 哎呀,真的,让我再想一想。
    【解决方案2】:

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

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

    希望你能从那里拿走它。

    【讨论】:

    • 对不起,我不明白。什么是 a-f?
    • @WaqarHameed:标量值。我把它作为练习让读者弄清楚他们的价值观。
    • 对不起。这个问题的目的是确定获得两个矩阵的精确度。您的回答似乎没有表明这一点。
    • @WaqarHameed:确实应该直接从上面的巨大线索中得出。这里有一个进一步的提示:a 始终是1b 必须是什么才能正确生成 M 的第二列?
    • @WaqarHameed:A*B 可以被视为每次将向量 A 乘以 B 的元素给出的不同数字。所以 M 的第一列将是 A 乘以中的第一个元素B,M 的第 2 列将是 A 乘以 B 的第 2 个元素,依此类推。所以你可以任意设置 A 等于 M 的第一列,这使得 B 的第一个元素等于 1。现在从那里继续。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-13
    • 2019-03-26
    • 1970-01-01
    • 1970-01-01
    • 2017-02-04
    • 1970-01-01
    • 2014-05-17
    相关资源
    最近更新 更多