我想使用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});
最后一行给出错误:
警告无法计算文件的依赖关系:
添加
因为:文件,功能或类"添加"可能不存在。
如何批量运行类方法?
答案 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
不会进行就地修改。