【问题标题】:How to get the gradient of function from vectors to scalars?如何获得从向量到标量的函数梯度?
【发布时间】:2018-09-23 03:11:18
【问题描述】:

给定一个函数 f:R^600 -> R f(x)=0.5*norm(Ax-b)^2,其中A 是一个 400x600 的矩阵,b 是 400x1,两者都给定了。

如何在 MATLAB 中以某个给定的x0 获得gradient(f)

m=400
n=600
A=randn(m,n)
b=randn(m,1)

syms x
f= 0.5*norm(A*x-b)^2
gradient(f,x)

但是它不起作用,因为它似乎将x 视为标量,而不是向量。

【问题讨论】:

    标签: matlab gradient


    【解决方案1】:

    给定函数:

    渐变只是:

    查看this了解更多详情。

    因此,您的 MATLAB 实现是:

    g = A'*(A*x-b);
    

    其中 g 是给定 x 的函数梯度。

    注意 A、b 和 x 是数字,而不是符号。

    证明


    符号方法

    您可以使用以下代码:

    N = 3;
    
    A = [1 0 1;
         2 1 -1;
         3 1 0];
    
    b = [1;
         2;
         3];
    
    x = sym('x', [N, 1]);
    
    f = 0.5*norm(A*x-b)^2;
    
    g = sym('g', [N, 1]); % g is the gradient of f
    for i=1:N
        g(i) = diff(f,x(i));
    end
    

    【讨论】:

    • 我承认我很久以前就有微积分了,但我很确定你缺乏对内函数求导。使您的解决方案出错。
    • @NickyMattsson。你说的对!缺少一个术语。我要修复它,我还会添加一个参考。
    • 感谢您的回答。但是,我怎样才能通过MATLAB而不是手动计算得到f的梯度呢?
    • 我为符号演算添加了一个 sn-ps 代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-05
    • 2017-08-05
    • 1970-01-01
    相关资源
    最近更新 更多