我正在解决一个非常大的优化问题。目标函数和约束函数需要大量数据。目前,我将数据作为结构传递给他们。
myFS(X, Dat, g_Index, f_Index) % Dat is a structure which includes many variables
你认为这是减少经过时间的有效方法吗?
还有哪些更好的替代方案?
这是关于类定义的给定答案是什么意思?
%% First we define the class in a separate file:
classdef myDataStructure < handle
properties
NRES;
NOBJ;
NVAR;
end
methods
function obj = myDataStructure()
end
end
end
%% In another file where the main program is, we initialize the class.
Dat = myDataStructure();
%% Initialize
Dat.NRES = 1;
Dat.NOBJ = 1;
Dat.NVAR = 1;
[myF, Dat_updated] = BBB(Dat);
%% Here we define the function and use the class
function [f, CalssDat] = BBB(CalssDat)
x = CalssDat.NRES;
y = CalssDat.NOBJ;
z = CalssDat.NVAR;
f = x + y + z;
CalssDat.NOBJ = 2;
end
答案 0 :(得分:2)
据我所知,MATLAB实际上并没有复制传递给函数的数据内容,直到你在函数本身修改它为止 - 在这种情况下,它会产生一个本地副本并占用一些CPU时间
因此,只要Dat
myFS()
内部没有变化,您现在所做的就不会增加任何CPU开销。如果您确实更改Dat
内myFS()
的值并希望将其返回,我可以考虑两种方法来优化它:
您可以将myFS()
声明为:function [Dat, anythingElse] = myFs(X,Dat,g_Index, f_Index)
,这会阻止matlab制作本地副本。
另一种方法是使用派生自handle
并且Dat
成为其中一员的类。这样,每当您传递包含Dat
的对象时,您只传递对象句柄而不是对象本身的副本。
第二种方法的例子:
classdef myDataStructure < handle
properties
p1FromDat;
p2FromDat;
% .
% .
% .
pNFromDat;
end
methods
function obj = myDataStructure()
% Add initialization code here if you want. Otherwise p1FromDat
% ... pNFromDat are accessible from outside
end
end
end
比你的代码:
Dat = myDataStructure();
Dat.p1FromDat = 1;
Dat.p2FromDat = 1;
在您的myFs()
中,您使用的Dat与您之前使用的方式完全相同。
因为myDataStructure派生自handle
,所以当你传递Dat时,不会复制里面的数据。
执行请注意这一点,因为当您更改Dat
中的myFS()
时,值也会在myFS()
的范围之外更改。< / p>