Добавление терминов в анонимную функцию в цикле for

#matlab

#matlab

Вопрос:

Я пытаюсь добавить термины в анонимную функцию в цикле for.

Изотерма = @(N) log(N)-log(P);

k = 0; для an= Изотерми2 = @(N) (1/T) * an * mpower(N,k); Изотерма = @(N) Изотерма (N) Изотерми2(N); k = k 1; конец

k = 0; для bn=b Изотермия2 = @(N) bn*mpower(N,k); Изотерма = @(N) Изотерма (N) Изотермия2(N); k = k 1; конец

Я пробовал предыдущий код, но он работает некорректно. Нужно ли мне использовать функцию m-file?

Комментарии:

1. что не работает?.. более конкретно, чего вы пытаетесь достичь? Isotherm действует как вызов вложенной функции…

Ответ №1:

Немного сложно следить за тем, что вы собираетесь делать. Однако, если N это скалярное значение, следующее векторизованное решение должно выполнить требуемое вычисление:

 Isotherm = @(N) log(N)-log(P)   ...
                (1/T)*sum(a.*N.^(0:numel(a)-1))   ...
                sum(b.*N.^(0:numel(b)-1));
  

Кстати, насколько я НЕ ожидал, что следующее сработает, это действительно так:

 >> f = @(x) x;
>> for i = 2:4, f = @(x) f(x)   x.^i; end    %# f(x) = x   x.^2   x.^3   x.^4
>> f(2)

ans =

    30    %# 2   4   8   16

>> f(3)

ans =

   120    %# 3   9   27   81
  

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

Комментарии:

1. 1 за поиск, возможно, наименее поддерживаемой идиомы кодирования Matlab, когда-либо существовавшей.

2. @Andrew: Разве это не отвратительно !? Но это работает! Я предполагаю, что каждый раз, когда анонимная функция воссоздается в цикле, старая анонимная функция f захватывается и сохраняется постоянной в своем текущем значении, как и любая другая переменная без аргументов в анонимном выражении. Интересно, есть ли какие-либо ограничения на это, например, увеличение использования памяти для хранения «замороженных» анонимных функций.