如何获得从向量到标量的函数梯度?

时间:2018-09-23 03:11:19

标签: matlab gradient

给出一个函数f:R ^ 600-> R f(x)=0.5*norm(Ax-b)^2,其中A是400x600矩阵,b是400x1,并且都给出了它们。

如何在MATLAB中给定的gradient(f)处获得x0

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视为标量,而不是向量。

1 个答案:

答案 0 :(得分:1)

给出功能:

f(x) = \frac{1}{2}\|Ax-b\|^2

梯度就是:

Ax-b

检查this以获得更多详细信息。

因此,您的MATLAB实现是:

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

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

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

证明

f(x) = \frac{1}{2}\|Ax-b\|^2


符号化方法

您可以使用以下代码:

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