在 MATLAB 函数之间传递数据的有效方式
Efficient way of passing data between MATLAB functions
我正在解决一个非常大的优化问题。 objective 函数和约束函数需要大量数据。目前我正在将数据作为结构传递给他们。
myFS(X, Dat, g_Index, f_Index) % Dat is a structure which includes many variables
您认为这是减少运行时间的有效方法吗?
有什么更好的选择?
这是关于 class 定义的给定答案的意思吗?
%% 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
据我所知,直到您在函数本身中修改它时,MATLAB 才真正复制您传递给函数的数据内容 - 在这种情况下,它会制作一个本地副本,这需要一些时间CPU次。
因此,只要 Dat
在 myFS()
内部没有变化,您现在所做的就不会增加任何 CPU 开销。如果您确实更改了 myFS()
中 Dat
的值并想要 return 它,我可以想到两种优化方法:
您可以将 myFS()
声明为:function [Dat, anythingElse] = myFs(X,Dat,g_Index, f_Index)
,这样可以防止 matlab 制作本地副本。
另一种方法是使用从 handle
派生的 class 并让 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时不会复制里面的数据。
做要小心,因为当你在myFS()
中改变Dat
时,值会在[=13=的范围之外改变] 还有。
我正在解决一个非常大的优化问题。 objective 函数和约束函数需要大量数据。目前我正在将数据作为结构传递给他们。
myFS(X, Dat, g_Index, f_Index) % Dat is a structure which includes many variables
您认为这是减少运行时间的有效方法吗?
有什么更好的选择?
这是关于 class 定义的给定答案的意思吗?
%% 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
据我所知,直到您在函数本身中修改它时,MATLAB 才真正复制您传递给函数的数据内容 - 在这种情况下,它会制作一个本地副本,这需要一些时间CPU次。
因此,只要 Dat
在 myFS()
内部没有变化,您现在所做的就不会增加任何 CPU 开销。如果您确实更改了 myFS()
中 Dat
的值并想要 return 它,我可以想到两种优化方法:
您可以将 myFS()
声明为:function [Dat, anythingElse] = myFs(X,Dat,g_Index, f_Index)
,这样可以防止 matlab 制作本地副本。
另一种方法是使用从 handle
派生的 class 并让 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时不会复制里面的数据。
做要小心,因为当你在myFS()
中改变Dat
时,值会在[=13=的范围之外改变] 还有。