#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
захватывается и сохраняется постоянной в своем текущем значении, как и любая другая переменная без аргументов в анонимном выражении. Интересно, есть ли какие-либо ограничения на это, например, увеличение использования памяти для хранения «замороженных» анонимных функций.