我的目标是求解满足[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]来满足等式?谢谢!
答案 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
最优的。话虽如此,我会坚持最小的方格;)