在 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次。

因此,只要 DatmyFS() 内部没有变化,您现在所做的就不会增加任何 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=的范围之外改变] 还有。