2016-10-23 38 views
0

我在parfor-loop正文中調用的函數中使用evalin時出現問題。函數看起來如下:在parfor中使用evalin的matlab

function returnData = extractFun(input) 

    % assign close price to function call 
    x = evalin('base','data'); 

    % extract prices 
    returnData = x(input); 

end 

和腳本調用該函數如下:

% data-array = n-by-1 double 
data = [1:1000]'; 

% loop and extract data 
parfor i = 1:10 

    % n-by-1 cell array containing 1-by-x doubles 
    % doubles in var1 contain valid indicies for the data-variable 

    var1 = {[1:10]; [1:30]}; 

    % perform cell-function since, cell2mat will not work due to 
    % inconsistent dimensions of the double arrays contained in the cells 

    extractData = cellfun(@returnData,var1,'UniformOutput',false); 

    % do something with extractData 

end 

當我運行在parfor -loop腳本,MATLAB拋出一個錯誤,該指數超過矩陣尺寸,這必須表示變量x爲空(或未被正確評估)。奇怪的是,當我作爲正常的for循環運行循環時,一切正常。我知道parfor -loops的透明度問題,因此我將evalin放入一個單獨的函數中。

我也將開放給我的問題的替代解決方案,它是從一個數據變量提取數據到一個n×1的單元格數組中,因爲doubles沒有使用額外的循環,因爲我打算運行此循環具有非常高的迭代次數。

任何人都可以幫我嗎?謝謝!

回答

0

evalinparfor不要混合。即使您使用本地池運行parfor,也希望將運行循環迭代的工作者視爲完全獨立的進程。換句話說,他們根本沒有可視的基礎工作空間。由於某種原因,在循環體中不允許使用evalin;將其隱藏在函數中並不會改變工作人員的本地基工作區中沒有變量data的事實,這會使語句失敗。

我不清楚爲什麼你在這種情況下非常害怕循環。首先,它不再是2006年,當時環路對你來說仍然非常糟糕;已經完成了一些優化Matlab的工作。其次,evalinevalin的呼叫是簡單地讀取索引的相當低效的方式,並且cellfun不僅僅是隱藏循環。第三,您打算在這裏運行parfor,這意味着您可能無法處理來自全矢量化循環替換的可能更高的內存使用量。

因此,只需用

extractData = cell(size(var)); 
for iVar = 1:numel(var) 
    extractData{iVar} = data(var{iVar}); 
end 
+0

已選擇使用該解決方案代替cellfun -call。你是對的 - 額外循環的額外處理時間並不像我想象的那麼糟糕,並且比cellfun快得多(很可能如你所說,因爲它實際上是一種循環)。謝謝你的幫助! – Benvaulter