2013-07-09 2 views
0

В MATLAB является то лучше (насколько оптимизация обеспокоенно):Минимизация входы от значений нагрузки в функции MATLAB

1) Для того, чтобы иметь функцию «Foo» с большим количеством входов, которые приходят из выходов другие функции

или

2) Сохранить в конце функций результаты в файл results.mat и загрузить его в функции «Foo» и минимизировать его входы таким образом?

+2

или 3) использовать 'cell' или' struct' для сбора и/или группировки данных и сведения к минимуму аргументов –

ответ

1

почти всегда: вариант 1.

Как вариант 2 зависит от файла ввода-вывода, и, таким образом, один и один записи для чтения в/из жесткого диска, SSD или подобное, то, скорее всего, проиграет от поддержания переменных в ОЗУ , Более того, если вы передаете аргументы функции, и эта функция только читает, то явно не создаются копии этой переменной. Это не верно для .mat файла решения, как то, что у вас уже есть в памяти будет явно скопированы на в чрезвычайно медленных устройств (HDD, SSD), а затем снова считываются в память с крайне медленное устройство, просто чтобы сохранить несколько входных аргументов.

Итак, если вы не работаете с большими наборами данных и ваши переменные не дают ошибок в памяти, держите все в ОЗУ как можно больше.

Вы можете свести к минимуму количество аргументов, просто собирая данные в виде данных контейнера. MATLAB имеет cell и struct для этой цели (или classdef, если вы включаете классы значений). Вы можете превратить это:

[outarg1, outarg2] = function(arg1, arg2, arg3,...) 

в

[outarg1, outarg2] = function(S) 

где

S = struct(... 
    'arg1', function1(X),... 
    'arg2', function2(X,Y,Z),... 
    'arg3', function3(X,Z),... 
    %// etc. 
); 

или

S = { 
    function1(X) 
    function2(X,Y,Z) 
    function3(X,Z) 
    %// etc. 
} 

или аналогичный. Или вы можете использовать специальные cell/функций, называемых varargin/nargin и varargout/nargout:

varargout = function(varargin) 

    % rename input arguments 
    arg1 = varargin{1}; 
    arg2 = varargin{2}; 
    %// etc. 

    % assign all output arguments in one go 
    [varargout{1:nargout}] = deal(outargs{:})); 

end % function 

Вы можете прочитать больше о всех этих вещах, введя help <thing> в командной строке MATLAB. Например,

help cell 

даст вам массу информации о какой cell и как использовать его.

+0

Большое спасибо, ваш ответ был очень полезен. – Spyros

0

Я думаю, что использование глобальных переменных - лучший способ оптимизировать требования к памяти и обработке. вы можете использовать ключевое слово global.

+0

Независимо от того, что я читал до сих пор, и все говорят, чтобы избежать их почти в любом случае. Особенно в больших программах с большим количеством функций и т. Д. – Spyros

+1

Это неправда; глобальные переменные не обеспечивают лучшую производительность, чем прямая передача аргументов. Более того, [глобальные переменные обычно сильно не рекомендуется] (http://c2.com/cgi/wiki?GlobalVariablesAreBad) в любой хорошо структурированной программе. Не из-за соображений производительности, но они, как правило, делают код намного более непрозрачным и «спагеттированным» в долгосрочной перспективе, чем другие парадигмы. Кроме того, в контексте многопоточных и распределенных вычислений глобальные переменные обычно довольно сложны для работы. –

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