0

我试图在 Matlab 中最小化 sum((Ar*B).^2) ,其中 A 和 B 是矩阵,r 是我正在操作的标量。我尝试了以下代码:

f = @(r) sum((A-r*B).^2);
Answer = fminbnd(f,lowrange,highrange);

但我得到一个错误。

4

2 回答 2

2

如果AB是矩阵,那么不会sum((A - r*B).^2)给你一个值。这将为您提供一值。如果输入是矩阵,则输出将为您提供一个数组,其中每个元素是矩阵中每一列的行的总和。sumsum

您指定的函数必须计算为单个值。我假设您想确定函数中的平方差之和,因此您需要用另一个. 因此,请尝试以下操作:fminbnd sum sum

f = @(r) sum(sum((A-r*B).^2));
Answer = fminbnd(f,lowrange,highrange);

该函数f现在将找到矩阵之间的差异AB哪个由 加权r,将这些差异平方,然后将所有这些差异加在一起。

试试看它是否有效。

于 2014-09-29T04:26:57.727 回答
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。即使没有完美的解决方案,这也应该可以正常工作,就像上面的例子一样。

于 2014-09-29T21:53:14.370 回答