Это действительно вопрос перестановки данных, чтобы все ваши переменные оптимизации были в одном массиве.
Например, рассмотрим следующую супер простую целевую функцию
function obj_val = my_obj(q, g, h, sigma)
obj_val = sigma*(q.'*q) + (h.'*h)*(g.'*g);
end
, где мыхочу найти оптимальные q
и g
для некоторой константы h
и sigma
.Тогда я мог бы сделать следующее
% constants
h = randn(6,1);
sigma = abs(randn());
% initial guess
q0 = randn(5,1);
g0 = randn(10,1);
% get dimensions of the variables
nq = numel(q0);
sq = size(q0);
ng = numel(g0);
sg = size(g0);
% Single variable containing both initial guesses
x0 = [q0(:); g0(:)];
% wrapper function which just takes x and distributes it to the arguments of my_obj
f = @(x) my_obj(reshape(x(1:nq), sq), reshape(x(nq+1:nq+ng), sg), h, sigma);
% solve for optimal x
x_opt = fminunc(f, x0);
% recover optimal q and g
q_opt = reshape(x_opt(1:nq), sq);
g_opt = reshape(x_opt(nq+1:nq+ng), sg);
fprintf('Resulting objective: %g\n', my_obj(q_opt, g_opt, h, sigma));
Примечание: Очевидно, что оптимальная точка равна ( q, g ) = ( 0 , 0 ) в этом примере.