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

我在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
    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