Вызов функции интерполяции октавы в теле функции - PullRequest
1 голос
/ 09 октября 2019

Я пытаюсь обернуть интерполяционную функцию Octave в тело функции,

function FUN = inter(p);
    FUN = interpn (x1, x2, x3, x4, x5, A, p(1), p(2), p(3), p(4), p(5), "spline");
end

Причина, по которой я это делаю, заключается в том, что я использую пакет, функция которого нуждается в функции имени строки, котораяв этом случае будет packageFunction ("inter", arguments1);

Проблема теперь вызывается, например, как,

  disp("value = "), inter([10 2 4 3 4])

не работает;Не видит ошибку векторов: 'x1' undefined,

Конечно, векторы xi и матрица A определены над телом функции. Буду признателен за совет,

спасибо, Дамир

------------- в файле example1.m

[a b c] = fminuit('gaussian','mnplot',[10 166 33],[x;y;dy])

------------ в файле gaussian.m

function f = gaussian(par,data);
%theoretical function
f = par(1)/(sqrt(2*pi)*par(3)) * exp(-.5*((data(1,:)- 
par(2))./par(3)).^2); 
if (size(data,1)==2),    %chi-square, error = 1
  f = sum((data(2,:) - f).^2);
 elseif (size(data,1)>2), %chi-square, error = 3rd row of data
 f = sum(((data(2,:) - f)./data(3,:)).^2);
end

1 Ответ

1 голос
/ 09 октября 2019

Учитывая, что вы используете старую функцию, для которой в качестве функции требуется строка, первое решение ниже не будет работать. Это, однако, правильный способ сделать это. Изменение старой функции для использования дескрипторов функций вместо строк было бы моим предпочтительным решением. Тем не менее, вы также можете использовать альтернативное решение ниже, которое использует глобальные переменные. Это не рекомендуемый подход ( мы должны стремиться избегать глобальных значений ), но он решит ваши краткосрочные проблемы.

Правильный подход: используйте анонимную функцию

Выследует использовать анонимную функцию, которая может захватывать переменные, когда они определены:

inter = @(p)interpn (x1, x2, x3, x4, x5, A, p(1), p(2), p(3), p(4), p(5), "spline");

Теперь inter(p) работает так же, как если бы inter был объявлен как нормальная функция. Но значения x1, x2 и т. Д., Как они были определены при определении inter, будут храниться внутри inter.

Как указано, функция, которую вы передаете inter, должна бытьнаписано для принятия дескрипторов функций.

Плохое, быстрое решение: используйте глобальные переменные

Сначала создайте файл inter.m со следующим содержимым:

function FUN = inter(p);
    global x1 x2 x3 x4 x5 A
    FUN = interpn (x1, x2, x3, x4, x5, A, p(1), p(2), p(3), p(4), p(5), "spline");
end

Далее,в вашей функции сценария, которая вызывает inter, снова объявите глобальные переменные (в настоящее время MATLAB предупреждает, что вы должны объявить их как глобальные переменные, прежде чем присваивать им значение, в будущих версиях это потребуется):

global x1 x2 x3 x4 x5 A
x1 = ...
x2 = ...
% etc

inter([10 2 4 3 4])
% or:
fminuit('inter',...)
...