在Matlab中找到以下最小函数

时间:2014-09-29 02:31:50

标签: matlab matrix minimization

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

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

但是我收到了错误。

2 个答案:

答案 0 :(得分:2)

如果AB是矩阵,则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加权的矩阵Br之间的差异,对这些差异进行平方,然后将所有这些差异加在一起。

试一试,看看它是否有效。

答案 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。即使没有完美的解决方案,这应该可以正常工作,就像上面的例子中一样。