Matlab Parfor:输入参数不足
我在matlab中发现了parfor函数的一个奇怪行为。请查看以下代码:Matlab Parfor:输入参数不足,matlab,parallel-processing,Matlab,Parallel Processing,我在matlab中发现了parfor函数的一个奇怪行为。请查看以下代码: function [x,y,z] = parForTest(test3) x = zeros(100,1); y = zeros(100,1); z = zeros(100,1); test1 = ones(1,100); test2 = zeros(1,100); useSameTest2 = false; if nargin == 1 test3Given = true; else test3Giv
function [x,y,z] = parForTest(test3)
x = zeros(100,1);
y = zeros(100,1);
z = zeros(100,1);
test1 = ones(1,100);
test2 = zeros(1,100);
useSameTest2 = false;
if nargin == 1
test3Given = true;
else
test3Given = false;
end
parfor s = 1:numel(test1)
if useSameTest2
tmpTest = test2(1);
if test3Given, tmpTest3 = test3(1); end
else
tmpTest = test2(s);
if test3Given, tmpTest3 = test3(s); end
end
if test3Given
[xt, yt, zt] = oneCombi(test1(s), tmpTest, tmpTest3);
else
[xt, yt, zt] = oneCombi(test1(s), tmpTest);
end
%% store results
x(s) = xt;
y(s) = yt;
z(s) = zt;
end
end
function [xt, yt, zt] = oneCombi(t1, tmpTest, tmpTest3)
if nargin == 3
xt = 1;
yt = 1;
zt = 1;
else
xt = 0;
yt = 0;
zt = 0;
end
end
如果您通过键入“[x,y,z]=parForTest();”来调用此函数,您将得到一个错误,指出没有足够的输入参数。如果你用“for”而不是“parfor”来运行整个程序,它就会工作。当你调用“[x,y,z]=parForTest(one(100,1));”时,它也会起作用。有人能给我解释一下这种行为吗?这似乎与我有一个可选论点的事实有关。如果我在“test3Given=false”之后添加行“test3=[];”,它也会起作用
带有并行计算工具箱的Matlab2014a。您未正确使用可选输入功能。我注意到,matlab有时允许调用类型为
F()
的函数,即使该函数声明为function result=F(x,y)
。如果在执行过程中未使用变量x
和y
,则允许此调用。我知道这很奇怪
现在,您的问题与您正在使用并行计算工具箱这一事实有关。当使用parfor
时,Matlab对parfor循环中使用的变量更为严格,这就是为什么它与for循环
配合使用,但与parfor
配合使用时效果很好的原因。Matlab需要确保所有工作人员都收到正确的信息、正确的切片和正确的定义(无论执行路径如何)
要解决您的问题,您需要将输入参数定义为varargin
,然后使用nargin
对不同的输入进行操作。您需要如下修改您的函数(请参见变量test3
始终是如何定义的,无论您将其称为parForTest()还是parForTest(无论什么)):
您未正确使用可选输入功能。我注意到,matlab有时允许调用类型为F()
的函数,即使该函数声明为function result=F(x,y)
。如果在执行过程中未使用变量x
和y
,则允许此调用。我知道这很奇怪
现在,您的问题与您正在使用并行计算工具箱这一事实有关。当使用parfor
时,Matlab对parfor循环中使用的变量更为严格,这就是为什么它与for循环
配合使用,但与parfor
配合使用时效果很好的原因。Matlab需要确保所有工作人员都收到正确的信息、正确的切片和正确的定义(无论执行路径如何)
要解决您的问题,您需要将输入参数定义为varargin
,然后使用nargin
对不同的输入进行操作。您需要如下修改您的函数(请参见变量test3
始终是如何定义的,无论您将其称为parForTest()还是parForTest(无论什么)):
function [x,y,z] = parForTest(varargin)
x = zeros(100,1);
y = zeros(100,1);
z = zeros(100,1);
test1 = ones(1,100);
test2 = zeros(1,100);
useSameTest2 = false;
if nargin == 1
test3Given = true;
test3 = varargin{1};
else
test3Given = false;
test3 = [];
end
parfor s = 1:numel(test1)
if useSameTest2
tmpTest = test2(1);
if test3Given, tmpTest3 = test3(1); end
else
tmpTest = test2(s);
if test3Given, tmpTest3 = test3(s); end
end
if test3Given
[xt, yt, zt] = oneCombi(test1(s), tmpTest, tmpTest3);
else
[xt, yt, zt] = oneCombi(test1(s), tmpTest);
end
% store results
x(s) = xt;
y(s) = yt;
z(s) = zt;
end