How we can use fminsearch with a vector as input and return a scaler as an output?

1 view (last 30 days)
Hello,
I have the objective function and I want to minmize this gradiant. e is a vector of ones and y is a vector of size . The . I want find that minmize this objective function. Here is my attempt:
y = rand(1000, 1); % Random target values
e = ones(size(y))
global y
My target function is :
function gradient = gradient(h)
global y
gradient = 2 * (h*ones(size(y)) - y);
end
and then calling the function into fminsearch to get the result by :
mu_y = fminsearch( @(h)gradient(h),0);
and I got the error massage :
>> mu_y = fminsearch( @(h)gradient(h),0);
Unable to perform assignment because the size of the left side is 1-by-1 and the size of the right side is
1000-by-1.
Error in fminsearch (line 201)
fv(:,1) = funfcn(x,varargin{:})
Can someone please help in this problem thanks.

Accepted Answer

Walter Roberson
Walter Roberson on 5 Jun 2023
y is 1000 x 1.
You are passing scalar 0 as the initial value for fminsearch() so at each step h will be 0 inside your gradient function.
gradient = 2 * (h*ones(size(y)) - y);
ones(size(y)) is 1000 x 1. h is scalar and scalar * 1000 x 1 is 1000 x 1. Subtract the 1000 x 1 y and you get a 1000 x 1. Multiply that by 2 and you get 1000 x 1 that is returned.
However fminsearch requires that you return a scalar.
You need to return something closer to
gradient = sum(2 * (h*ones(size(y)) - y).^2);
Note though that scalar * ones(size(y)) - y is going to give you the same result as (h - y) -- the scalar would automatically be replicated to the size of y.
I suspect that your should be a 1 x 1000 vector. Because if not, then you can calculate the optimal h without using fminsearch() by using calculus:
numel(y)*4*h == 4*sum(y) ---> h = sum(y)/numel(y) --> h = mean(y)

More Answers (0)

Categories

Find more on Large Files and Big Data in Help Center and File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!