给出一个函数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
视为标量,而不是向量。
答案 0 :(得分: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