Если у меня есть функция f (x, y), я хочу знать, как определить другую функцию (скажем, g), где g (x) = f (x, y), где y был определен заранее, либо явно, либо как ввод другой функции.

Я знаю, что это, вероятно, довольно просто, но мой код, похоже, не работает, и я не могу найти решение в документации.

0
user85798 9 Янв 2018 в 04:19

2 ответа

Лучший ответ

Вероятно, вы ищете анонимные функции.

Очень распространенный вариант использования - минимизация. Часто вам нужно минимизировать функцию нескольких переменных по одному параметру. Это оставляет вас без возможности просто передать константы для остальных параметров.

Анонимное определение g будет выглядеть так:

g = @(x) f(x, y)

y должна быть переменной, определенной в текущей рабочей области. Значение y постоянно привязано к функции. Независимо от того, выполняете ли вы clear y или присваиваете ему другое значение, значение y, используемое в g, будет таким, каким оно было при первом создании дескриптор функции.

Как упоминалось в другом, теперь удаленном, ответе, вы можете использовать гораздо более уродливый подход, используя global переменные.

Недостатки в том, что ваш код будет трудно читать и поддерживать. Значение переменной может меняться во многих местах. Наконец, есть просто лучшие способы сделать это, доступные в современных версиях MATLAB, например вложенные функции, даже если анонимные функции по каким-то причинам у вас не работают.

Преимущества в том, что вы можете сделать g простой автономной функцией. В отличие от анонимной версии, вы получите другие результаты, если измените значение y в базовой рабочей области, только будьте осторожны, чтобы не очистить его.

Главное, что нужно помнить о глобальных объектах, - это то, что каждая функция / рабочая область, желающая поделиться значением, должна объявить имя глобальным (перед назначением ему, чтобы избежать предупреждения).

В базовой рабочей области:

global y
y = ...

В g.m:

function [z] = g(x)

global y;
z = f(x, y);

Я не особо рекомендую эту технику, но это помогает знать о ней в случае, если вы не можете выразить g как одно выражение.

Примечание о предупреждениях. И анонимные функции, и глобальные переменные предупредят вас о назначении уже существующей переменной. Вот почему объявление global в качестве первой строки функции обычно является хорошей практикой.

1
Mad Physicist 9 Янв 2018 в 03:49
f = @(a,b) a^2 + b^2;
y = 4;
g = @(x) f(x,y);
g(2)

ans = 20
1
AnonSubmitter85 9 Янв 2018 в 01:41