Короче говоря : есть ли элегантный способ ограничить область действия анонимных функций или Matlab не работает в этом примере?
У меня есть функция, которая создает дескриптор функции для использования в решателе трубопроводной сети. Он принимает в качестве входных данных состояние сети, которое включает в себя информацию о каналах и их соединениях (или ребрах и вершинах, если необходимо), создает большую строку, которая будет возвращать большую матрицу в форме функции, и «изгоняет» эту строку для создания дескриптора .
function [Jv,...] = getPipeEquations(Network)
... %// some stuff happens here
Jv_str = ['[listConnected(~endNodes,:)',...
' .* areaPipes(~endNodes,:);\n',...
anotherLongString,']'];
Jv_str = sprintf(Jv_str); %// This makes debugging the string easier
eval(['Jv = @(v,f,rho)', Jv_str, ';']);
Эта функция работает как задумано, но всякий раз, когда мне нужно сохранить более поздние структуры данных, содержащие этот дескриптор функции, ей требуется нелепый объем памяти (150 МБ) - по совпадению примерно столько же, сколько все рабочее пространство Matlab на момент создания этой функции (~ 150 МБ). Переменные, которые требуются для этого дескриптора функции из рабочего пространства getPipeEquations, не слишком велики, но еще более странно то, что, когда я проверяю дескриптор функции:
>> f = functions(Network.jacobianFun)
f =
function: [1x8323 char]
type: 'anonymous'
file: '...\pkg\+adv\+pipe\getPipeEquations.m'
workspace: {2x1 cell}
... поле рабочего пространства содержит все, что было у getPipeEquations (что, кстати, не всего рабочего пространства Matlab).
Если вместо этого я переместу оператор eval в подфункцию в попытке форсировать область действия, дескриптор сохранит гораздо более компактно (~ 1 МБ):
function Jv = getJacobianHandle(Jv_str,listConnected,areaPipes,endNodes,D,L,g,dz)
eval(['Jv = @(v,f,rho)', Jv_str, ';']);
Это ожидаемое поведение? Есть ли более элегантный способ ограничить область действия этой анонимной функции?
В качестве дополнения, когда я запускаю симуляцию, включающую эту функцию несколько раз, очистка рабочих пространств становится мучительно медленной, что может или не может быть связано с обработкой Matlab функции и ее рабочей области.