Короче: существует ли элегантный способ ограничить область анонимных функций, или же 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 функции и ее рабочей области.