【发布时间】:2013-10-02 15:04:21
【问题描述】:
我想知道如何在 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
【问题讨论】:
-
只是出于好奇,多次解决它如何改变结果?求解器是随机的吗?
-
其实方程组有很多随机参数,我需要针对每一种不同的随机参数组合来求解。最终会发生的是,我将在 parfor 循环之外创建一个 Cplex() 对象,然后将其复制/替换为 parfor 循环内的随机参数。
-
我试图了解您在这里需要什么时的其他一些问题... 1) 创建对象的函数调用
Cplex()是否昂贵? 2)一旦你设置了参数(或者无论如何设置),a=Cplex()和b=Cplex()会代表同一个系统吗? 3)a和b有相同的句柄吗? -
@yoda 1) 函数/构造函数调用 Cplex() 相对昂贵,因为从头开始构建它并在 parfor 循环中设置它基本上减少了并行处理所节省的所有时间。 2)/3) 不完全确定这里的问题,a = Cplex() 将创建一个可以使用 a 访问的 CPLEX 对象。 b = a 将简单地创建另一个指向同一 CPLEX 对象的指针,而 b = Cplex() 将创建一个完全不同的 CPLEX 对象。
-
感谢您的帮助!
标签: matlab parallel-processing