【问题标题】:Efficient way of passing data between MATLAB functions在 MATLAB 函数之间传递数据的有效方法
【发布时间】:2015-05-24 07:13:35
【问题描述】:

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

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

【问题讨论】:

  • 是的,我的回答是这个意思。只需记住一件事:在您的行中,[myF,Dat_updated]=BBB(Dat);Dat_updatedDat 将是相同的(即它们的 ClassDat.NOBJ 等于 2
  • 那很好。我将把它应用到我的方法上。谢谢@TamásSzabó
  • @TamásSzabó 我将您的方法应用于我的问题,但它并没有减少CPU time。我使用Dat Struct 的初始代码需要262 秒,使用此类定义需要302 sec。我试图在课堂上和课堂外的另一时间初始化 Dat,但仍然需要302 sec。我还应该说,我使用的Dat struct 几乎是巨大的,它通过了许多功能并进行了更新。但是Dat struc 似乎仍然比它的class 版本更有效。

标签: matlab function optimization parameter-passing


【解决方案1】:

据我所知,MATLAB 实际上不会复制您传递给函数的数据的内容,直到您在函数本身中修改它 - 在这种情况下,它会进行本地复制,这需要一些 CPU 时间.

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

您可以将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 时不会复制里面的数据。

注意这一点,因为当您在myFS() 中更改Dat 时,这些值也会在myFS() 的范围之外更改。

【讨论】:

  • 谢谢@tamás-szabó 但我不明白最后一部分。你能解释一下如何使用类吗?
  • 嗯我不熟悉这个。 :((@tamás-szabó
  • 因此,如果在函数调用期间 Dat 发生变化,Matlab 会对其进行复制,这将增加 CPU 负担。但是,如果我使用类定义,Dat 的更改不会造成 CPU 负担吗? @tamás-szabó
  • @Jamaisavenir:正如我在帖子中提到的。如果Dat 是一个数据结构,并且您在myFs() 中对其进行了更改,matlab 会对其进行操作的本地副本(确实需要一些CPU 时间,具体取决于Dat 的大小)。如果您使用我建议的基于类的方法而不是数据结构,则不会复制,但更改将直接应用于您传递给myFs()的数据
  • 非常有趣。我想我应该学习这个类定义。还有一个问题,假设我将这个 Dat struc 定义为函数 A 中的类变量,现在我将它传递给函数 B。此时如果我向这个 Dat struc 添加一个新变量(Dat.bb=1; bb 不是之前存在于 Dat 中)并将其传递给函数 C,Matlab 是否将所有数据复制到 C ,还是直接应用新更新? @tamás-szabó
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-27
  • 1970-01-01
  • 2015-12-22
  • 1970-01-01
  • 1970-01-01
  • 2012-05-17
  • 2021-03-30
相关资源
最近更新 更多