我想知道如何在MATLAB中复制(也许删除)处理对象。
我目前正在使用MATLAB和一个名为CPLEX的附加组件编写大型方程组的求解器。此解算器主要涉及创建CPLEX句柄对象,然后使用求解方法解决它们,如下所示:
P = Cplex() %Create a Cplex object
%Code to specify the Cplex parameters
P.solve() %solve the Cplex object
在上面的代码中,P是属于Cplex()类的MATLAB句柄对象。它存储与其方程因子相关的矩阵结构。
我正在运行的主要问题是我必须多次“解决”相同的CPLEX对象,并且我想使用parfor循环并行执行此操作。不幸的是,MATLAB中的parfor循环需要透明性,因为多个线程不能在同一个对象上工作。
我已经考虑了几种方法:之前,我在parfor循环中创建并设置了Cplex()文件(事实证明这比单个线程实现慢);我也尝试将对象保存到磁盘并在parfor循环中加载它(再次太慢)。现在我想看看我是否可以复制对象(在parfor循环内或在其外部)。不幸的是,Cplex对象没有内置的“复制”功能,我必须自己编写类似的代码。
基本上我想做的事情归结为:
P = Cplex() %creates Cplex object
%Setup Cplex object
Q = cell(1,n) %create a container for Cplex objects
parfor 1:n
Q{i} = P.copy %create a copy of P and label it as Q{i}
Q{i}.solve()
Q{i} = [] %delete Cplex object (for memory purposes /preferable, but not necessary)
end
答案 0 :(得分:1)
我没有CPLEX,因为我无法复制您的代码,请尝试以下建议并让我知道它是否有效(或者如果您收到错误,错误是什么)。
尝试将Q
循环之外的parfor
定义为
Q=arrayfun(@(x)P.copy,1:n,'UniformOutput',false);
这应该像以前一样创建一个单元格,你可以像Q{i}
一样访问它,并且可以节省一些时间(因为如果你担心在处理后删除每个元素的内存问题,那么复制它也可能涉及一些时间开销。)
答案 1 :(得分:0)
我认为基本上有3种可能性,具体取决于CPLex的实施细节:
copyobj
对于图形对象。MyCPlex
并实现复制方法。只要没有任何重要属性private
。鉴于构造函数的CPU耗时很高,2或3.可能是更好的版本,因为您可能必须实现一个空构造函数:一个只返回一个对象句柄而没有所有内部初始化的东西。 复制的实现细节应该是直截了当的 - 将copy-object的所有属性设置为原始对象的值: 在它的天真版本中:
copyObj = CPlex();
props = {'propA', 'propB', ...}; % list of a all non-dependent, non-constant properties
for i=1:numel(props)
copyObj.(props{i}) = originalObj.(props{i});
end
根据CPlex内部的复杂性,事情当然可能会更复杂......