在MATLAB函数之间传递数据的有效方法

时间:2015-05-24 07:13:36

标签: matlab function optimization parameter-passing

我正在解决一个非常大的优化问题。目标函数和约束函数需要大量数据。目前,我将数据作为结构传递给他们。

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

1 个答案:

答案 0 :(得分:2)

据我所知,MATLAB实际上并没有复制传递给函数的数据内容,直到你在函数本身修改它为止 - 在这种情况下,它会产生一个本地副本并占用一些CPU时间

因此,只要Dat myFS()内部没有变化,您现在所做的就不会增加任何CPU开销。如果您确实更改DatmyFS()的值并希望将其返回,我可以考虑两种方法来优化它:

您可以将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>