總之:是有限制的匿名功能範圍優雅的方式,或者是Matlab的在這個例子中破?MATLAB函數手柄工作區惡作劇
我有一個創建一個功能手柄管網解算器要使用的功能。它將網絡狀態作爲輸入,其中包括關於管道及其連接(或者必要時的邊和頂點)的信息,構造一個大的字符串,該字符串在函數形式中返回一個大矩陣,然後「evals」該字符串以創建句柄。
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, ';']);
此功能按預期工作,但每當我需要保存包含此功能手柄後面的數據結構,它需要一個可笑量的內存(150MB) - 巧合的是大約相當於整個Matlab的工作空間在創建這個函數的時候(〜150MB)。這個函數句柄從getPipeEquations工作區需要的變量不是特別大,但什麼是更瘋狂的是,當我檢查功能手柄:
>> f = functions(Network.jacobianFun)
f =
function: [1x8323 char]
type: 'anonymous'
file: '...\pkg\+adv\+pipe\getPipeEquations.m'
workspace: {2x1 cell}
...工作區字段包含一切getPipeEquations有(其中,順便說一句,是而不是整個Matlab工作區)。
如果我移動而不是eval語句的子功能,企圖迫使範圍,手柄會節省更多的緊湊(〜1MB):
function Jv = getJacobianHandle(Jv_str,listConnected,areaPipes,endNodes,D,L,g,dz)
eval(['Jv = @(v,f,rho)', Jv_str, ';']);
這是預期的行爲?有沒有更好的方法來限制這個匿名函數的範圍?
作爲附錄,當我多次運行包含此函數的模擬時,清除工作區變得非常緩慢,這可能與Matlab的函數及其工作空間的處理有關,也可能不相關。
你有沒有試過evalin('base',...)'?這有什麼區別嗎? – 2011-12-29 19:20:53
我沒有,但工作區應該已經被限制在getPipeEquations的範圍內。 – 2011-12-29 20:57:40