如果我想运行类的方法,如何使用parcluster在Matlab中运行批处理作业

时间:2016-04-11 15:39:01

标签: matlab

我想使用parcluster在批处理中运行Matlab中的作业。每个作业都应该使用现有的类,并运行其中一个方法。我可以让它在没有parcluster的情况下工作,但是使用parcluster我会收到错误。

没有parpool,这有效:

使用简单方法定义一个类:

classdef myclass
    properties
        prop;
    end
    methods
        % constructor
        function obj = myclass()
             obj.prop = 0;
        end
        % add function 
        function obj = add(obj,a)
            obj.prop = obj.prop + a;
        end
    end
end

创建一个对象并使用它的功能:

obj = myclass();
obj = add(obj,1);
这是有效的。但是当我尝试批量运行相同的东西时,我得到一个错误。这就是我正在做的事情:

c = parcluster();
j = batch(c,@myclass,1,{});
wait(j);
r = fetchOutputs(j);
obj = r{1};
j = batch(c,@add,1,{obj,1});

最后一行给出错误:

  

警告无法计算文件的依赖关系:
  添加
   因为:文件,功能或类"添加"可能不存在。

如何批量运行类方法?

1 个答案:

答案 0 :(得分:1)

在匿名函数中指定类方法的最强大方法是使用点符号

B = batch(c, @obj.add, 1, {1});

wait(B)

%// Re-assign results to obj (see note below)
obj = fetchOutputs(B);

这有助于MATLAB更好地解决myclass.add,因为它更明确。你以前编写它的方式,MATLAB正在寻找一个名为add的常规函数​​,但无法找到它。它不考虑输入的类型(在您的情况下需要知道它是一种方法)。

  

注意:当您将对象作为输入传递时,batch将对您的对象进行复制。因此,您需要明确获取输出并重新分配给obj,因为原始的obj 不会进行就地修改。