【问题标题】:Function and its gradient in MatlabMatlab中的函数及其梯度
【发布时间】:2018-04-12 12:35:32
【问题描述】:

我正在做一个 Matlab 项目,我想在 Matlab 中制作以下函数的渐变:

f(x) = c^T * x - sum (log(bi - (ai ^ T) * x)).

其中 ai^T 是随机 A 矩阵 nxm 的行,其中 n=2m=20 c是随机矩阵nx1,x也是随机nx1。 b 是随机矩阵 mx1。 我已经完成了以下操作,但我得到的结果似乎不正确..

function gc0 = gc(x, c, b, A)

 for k = 1 : length(A(:,1))
     f1(k) = sum(log(b - A(k,:)'*x(k)));
 end

 gradient(-f1)
 gc0 = c - gradient(f1)';

有什么想法吗?感谢您的帮助,我是 Matlab 的新手..

【问题讨论】:

  • 我假设你需要b(k)。另外A(k,:).' 以防万一。 log 不是 log10,以防你需要那个。你既没有转置c,也没有乘以x
  • 我没有转置 c 也没有将它乘以 x,因为 gc0 是我想要制作的 f 的梯度,而 c^T *x 的梯度是 c..
  • 但是sum (log(bi - (ai ^ T) * x))的梯度不是sum (log(bi - (ai ^ T) * x))

标签: matlab gradient convex-optimization


【解决方案1】:

您的循环似乎包含错误。看上面的公式, 我认为功能评估应该是

f1 = c'*x;
for k = 1 : length(A(1,:))
    f1 = f1 - log(b(k) - A(:,k)'*x)
end

Matlab 中一个更短、更快的符号是

f = c'*x - sum(log(b - A' * x)) ;

函数“梯度”不计算我认为你的梯度 想要:它返回矩阵条目的差异,以及你的函数 f 是一个标量。

相反,我建议用符号计算导数:

Gradf = c'   + sum( A'./(b - A' * x) );

【讨论】:

    猜你喜欢
    • 2011-10-28
    • 1970-01-01
    • 2018-05-16
    • 1970-01-01
    • 1970-01-01
    • 2014-07-22
    • 2011-12-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多