当[C]已知时,求[A]满足[A] * [B] = [C],并且[B]随机生成,行数少于列数

时间:2014-10-02 14:37:11

标签: matlab matrix matrix-inverse

我的目标是求解满足[A] * [B] = [C]的矩阵[A],其中[C]已知且[B]是随机生成的。以下是一个例子:

C=[1/3 1/3 1/3]'*[1/3 1/6 1/6 1/6 1/6];
B=rand(5,5);
A=C*pinv(B);
A*B=C_test;
norm(C-C_test);
ans =

4.6671e-16

这里[C_test]的元素在原始[C]的1e-15之内,但是当[B]的行少于列时,错误会急剧增加(不确定是norm()是显示的最佳方式错误,但我认为它说明了问题)。例如:

B=rand(4,5);
A=C*pinv(B);
A*B=C_test;
norm(C-C_test);
ans =

0.0173

其他方法:

QR-分解

[Q,R,P]=qr(B);
A=((C*P)/R))*Q';
norm(C-A*B);
ans =

0.0173

/运营商

A=C/B;
norm(C-A*B);
ans =

0.0173

为什么会这样?在这两种情况下[B] * pinv([B])= [I]所以看起来该过程应该有效。 如果这是与pinv()或其他方法相关的生命的数值或代数事实,是否有另一种方法可以生成[A]来满足等式?谢谢!

1 个答案:

答案 0 :(得分:1)

由于C是3×5,因此C中的元素数量和方程数等于15.如果B是5×5,则未知数(A中的元素)等于3×5 = 15同样,解决方案也是准确的。

另一方面,如果B是例如3×5,则A中的元素数等于3×3 = 9,因此系统超定,这意味着得到的A将是最小二乘解

有关一般信息,请参阅维基百科:System of linear equations和Matlabs Overdetermined system

得到的矩阵A是最合适的,没有办法改进(至少在正方形意义上)。


回答您的第二个问题:您通过将{2}规范应用于A*B来衡量C的质量作为A*B-C的近似值:这相当于最小二乘配件。在此度量中,您使用的所有方法都提供了最佳答案。

如果您更喜欢其他一些措施,例如1-norm,Infinity-norm或任何其他度量(例如通过为列,行或元素选择不同的权重),则从原始方法获得的答案将是对于这项新措施,当然不一定是最佳的。

最常用的方法是使用一些优化例程,如下所示:

x = fminunc(f, zeros(3*size(B,1),1));
A = reshape(x,3,size(B,1));

其中f是某种(任何)衡量标准。最小二乘的度量应该产生相同的A.所以如果你尝试这个:

f = @(x) norm(reshape(x,3,size(B,1))*B - C);

A应与您的方法中的结果相匹配。

但你可以在这里使用任何f。例如,尝试1-norm:

f = @(x) norm(reshape(x,3,size(B,1))*B - C, 1);

或者疯狂的事情:

f = @(x) sum(abs(reshape(x,3,size(B,1))*B - C)*[1 10 100 1000 10000]');

这将给出不同的结果,这些结果是根据新的度量f最优的。话虽如此,我会坚持最小的方格;)