2015-05-24 3 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ó Я применил свой метод к моей проблеме, но это не уменьшило время процессора. Мой начальный код с 'Dat Struct' занимает' 262' сек и с этим определением класса занимает 302 сек. Я попытался инициализировать Dat один раз в классе и в другое время вне класса, но все равно он занимает 302 секунды. Я также должен сказать, что используемая мной DAT-структура почти огромна, и она проходит через многие функции и обновляется. Но все же 'Dat struc' кажется более эффективным, чем версия' class'. –

ответ

2

Насколько я знаю, MATLAB фактически не копировать содержимое данных, передать в функцию до того момента, когда вы измените его в самой функции - в этом случае он делает локальную копию и занимает некоторое процессорное время.

Таким образом, до тех пор, пока Dat не изменяется внутри myFS(), то, что вы делаете сейчас, не добавляет накладных расходов процессора. В случае, если вы измените значения 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.

Do быть осторожным с этим, потому что, когда вы меняете Dat в myFS(), значения будут изменены за рамки myFS() а.

+0

Спасибо @ tamás-szabó Но я не понял последнюю часть. вы бы объяснили, как использовать класс? –

+0

См. Пример в редакции моего сообщения. –

+0

hmm Я не знаком с этим. : ((@ tamás-szabó –

Смежные вопросы