2015-05-24 49 views
0

我正在解決一個非常大的優化問題。目標函數和約束函數需要大量的數據。目前,我將這些數據作爲結構傳遞給他們。在MATLAB函數之間傳遞數據的有效方式

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

是的,我的意思是我的答案。有一點需要記住:在你的行中[myF,Dat_updated] = BBB(Dat);','Dat_updated'和'Dat'將是同一個東西(即它們都有'ClassDat.NOBJ'等於'2') –

+0

這非常好。我打算將它應用於我的方法。謝謝@TamásSzabó –

+0

@TamásSzabó我將你的方法應用於我的問題,但它並沒有減少'CPU時間'。我使用'Dat Struct'的初始代碼需要262秒,這個類定義需要302秒。我曾嘗試在課堂上初次化Dat,並在課堂以外的時間初始化Dat,但仍需要302秒。我也應該說,我使用的'Dat struct'幾乎是巨大的,它通過許多函數並被更新。但是'dat struc'似乎比''class'版本更有效率。 –

回答

2

據我所知,MATLAB實際上並沒有當你在函數中修改複製數據的傳遞,直到點的函數內容需要一些CPU時間。

因此,只要DatmyFS()內部沒有變化,您現在正在做的事情不會增加任何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時,不會複製裏面的數據。

待辦事項小心這一點,因爲當你在myFS()改變Dat,該值將是myFS()範圍之外也改變了。

+0

謝謝@tamás-szabó但我不明白最後部分。你會解釋如何使用課堂? –

+0

查看我的帖子編輯中的示例。 –

+0

嗯我不熟悉這一點。 :((@tamás-szabó –