【问题标题】:Find minimum of following function in Matlab在 Matlab 中找到以下函数的最小值
【发布时间】:2014-09-30 07:15:13
【问题描述】:

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

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

但我得到一个错误。

【问题讨论】:

  • 您遇到了什么错误?
  • || 的操作数和 && 运算符必须可转换为逻辑标量值。 fminbnd (line314) 中的错误 - if ( (fu
  • 您能否给出一个可运行的小示例来显示此错误。对AB 使用随机5x5 矩阵,并在0 到10 之间最小化,我得到了一个不同的错误,因为您的目标函数没有返回标量。
  • @David - 你是对的。看起来 OP 正在尝试最小化平方差的总和,但是将sum 的输入作为矩阵,这将返回每列的行和数组。 OP 需要将其与另一个 sum 包装以使其正常工作,因为 fminbnd 需要一个输出单个值的函数。不错的收获!

标签: matlab matrix minimization


【解决方案1】:

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

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

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

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

试试看它是否有效。

【讨论】:

    【解决方案2】:

    如果您不需要对优化后的标量 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。即使没有完美的解决方案,这也应该可以正常工作,就像上面的示例一样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-18
      • 1970-01-01
      • 2013-09-07
      • 2016-02-12
      • 2021-08-30
      • 2017-01-04
      • 2014-12-15
      相关资源
      最近更新 更多