matlab 在 parfor 中使用 evalin
matlab using evalin in parfor
我在 parfor-loop
主体中调用的函数中使用 evalin
时遇到问题。该函数如下所示:
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
,而不使用额外的循环,就像我一样打算 运行 这个循环的迭代次数非常多。
谁能帮帮我?谢谢!
evalin
和 parfor
不要混用。即使您 运行 parfor
使用本地池,您也要将 运行 循环迭代的工作人员视为完全独立的进程。换句话说,他们根本看不到您的基础工作区。 evalin
由于某种原因不允许出现在循环体中;将其隐藏在函数中并不会改变 worker 的本地基础工作区中没有变量 data
的事实,这将使语句失败。
我不清楚为什么您在这种情况下如此害怕循环。首先,现在已经不是 2006 年了,那时循环对你来说仍然很糟糕。已经完成了一些优化 Matlab 的工作。其次,您使用 evalin
调用 cellfun
是一种相当低效的简单读取索引的方法,并且 cellfun
除了隐藏一个循环之外没有其他作用。第三,您打算在此处 运行 parfor
,这意味着您可能无法处理完全矢量化循环替换可能带来的更高内存使用量。
因此,只需将 cellfun
调用替换为
extractData = cell(size(var));
for iVar = 1:numel(var)
extractData{iVar} = data(var{iVar});
end
我在 parfor-loop
主体中调用的函数中使用 evalin
时遇到问题。该函数如下所示:
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
,而不使用额外的循环,就像我一样打算 运行 这个循环的迭代次数非常多。
谁能帮帮我?谢谢!
evalin
和 parfor
不要混用。即使您 运行 parfor
使用本地池,您也要将 运行 循环迭代的工作人员视为完全独立的进程。换句话说,他们根本看不到您的基础工作区。 evalin
由于某种原因不允许出现在循环体中;将其隐藏在函数中并不会改变 worker 的本地基础工作区中没有变量 data
的事实,这将使语句失败。
我不清楚为什么您在这种情况下如此害怕循环。首先,现在已经不是 2006 年了,那时循环对你来说仍然很糟糕。已经完成了一些优化 Matlab 的工作。其次,您使用 evalin
调用 cellfun
是一种相当低效的简单读取索引的方法,并且 cellfun
除了隐藏一个循环之外没有其他作用。第三,您打算在此处 运行 parfor
,这意味着您可能无法处理完全矢量化循环替换可能带来的更高内存使用量。
因此,只需将 cellfun
调用替换为
extractData = cell(size(var));
for iVar = 1:numel(var)
extractData{iVar} = data(var{iVar});
end