matlab中使用evalin进行matlab

时间:2016-10-23 09:36:08

标签: matlab parfor

我在evalin正文中调用的函数中使用parfor-loop时遇到问题。该功能如下所示:

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循环中运行脚本时,matlab会抛出一个错误,索引超出了矩阵维度,这必然意味着变量x为空(或者没有正确计算)。奇怪的是,当我将循环作为普通的for循环运行时,一切正常。我知道parfor - 循环的透明度问题,因此我将evalin放入一个单独的函数中。

我也愿意接受我的问题的替代解决方案,即将数据从一个数据变量提取到一个n乘1的单元格数组doubles,而不使用额外的循环,因为我打算以非常多的迭代次数运行此循环。

任何人都可以帮助我吗?谢谢!

1 个答案:

答案 0 :(得分:0)

evalinparfor不要混用。即使您使用本地池运行parfor,您也希望将运行循环迭代的worker视为完全独立的进程。换句话说,它们根本没有基本工作空间的可见性。出于某种原因,循环体中不允许evalin;将其隐藏在函数中并不会改变工作程序的本地基础工作空间中没有变量data的事实,这将使语句失败。

我不清楚为什么你在这种背景下如此害怕循环。首先,它不再是2006年,当时循环对你来说仍然很糟糕;已经完成了一些优化Matlab的工作。其次,使用cellfun进行evalin调用只是简单阅读索引的一种效率很低的方式,而cellfun除了隐藏循环之外没有其他功能。第三,您计划在此处运行parfor,这意味着您可能无法处理来自完全矢量化循环替换的可能更高的内存使用量。

因此,只需将cellfun - 调用替换为

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