我试图在Matlab中最小化和((A-r * B)。^ 2)其中A和B是矩阵,r是我操纵的标量。我尝试了以下代码:
f = @(r) sum((A-r*B).^2);
Answer = fminbnd(f,lowrange,highrange);
但是我收到了错误。
答案 0 :(得分:2)
如果A
和B
是矩阵,则sum((A - r*B).^2)
不会为您提供单个值。这将为您提供数组值。如果sum
的输入是一个矩阵,sum
的输出将为您提供一个数组,其中每个元素是矩阵中每列的行数之和。
您指定给fminbnd
的功能必须评估为单个值。我假设您要确定函数中平方差的总和,因此您需要将sum
与另一个 sum
包裹起来。因此,请尝试这样做:
f = @(r) sum(sum((A-r*B).^2));
Answer = fminbnd(f,lowrange,highrange);
函数f
现在将找到由A
加权的矩阵B
和r
之间的差异,对这些差异进行平方,然后将所有这些差异加在一起。
试一试,看看它是否有效。
答案 1 :(得分:0)
如果您不需要对优化标量r的可能值施加限制,那么您应该能够直接求解该等式而无需搜索最小值。如果A和B是向量,请使用:
ropt=(B'*B)^(-1)*B'*A;
如果A和B是数组,并且您希望最小化数组中所有元素的残差平方和,那么我相信以下内容将起作用(相同的公式,但将A和B转换为向量)。
ropt=(B(:)'*B(:))^(-1)*B(:)'*A(:);
示例:
b=[1;2;3]
a=2*b;
ropt=(b'*b)^(-1)*b'*a
根据需要返回ropt = 2.0000
同样,对于矩阵:
b=magic(3);
a=2*b;
ropt=(b(:)'*b(:))^(-1)*b(:)'*a(:)
也返回ropt = 2.0000。即使没有完美的解决方案,这应该可以正常工作,就像上面的例子中一样。