2013-04-19 3 views
0

Есть ли способ создания фрагментов кода внутри файла .m, который анализируется один раз во время компиляции в MATLAB?ifdef-like поведение в MATLAB

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

if mode==1 
    % code of mode 1 
elseif mode==2 
    % code of mode 2 
elseif mode==3 
    % code of mode 3 
end 

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

Поэтому я думал, что если у MATLAB есть что-то в строках #ifdef, например C, в котором я могу выделить все остальные части, которые не будут использоваться при выполнении.

ответ

3

Я думаю, вы могли бы решить вашу проблему элегантно используя Strategy pattern

Подумайте установив функцию ручки в вашем коде - или даже создавать объекты стратегии, если вы в объектно-ориентированном.

+0

+1 вы должны создать функцию 'select_implementation', которая возвращает дескриптор функции в одну из возможных реализаций' @ ​​func1, @ func2, ..' (каждый в отдельном M-файле). Это будет вызываться один раз, и дескриптор возвращенной функции будет передан вместе с фактическим вызовом, который выполняет итерации: 'fh = select_implementation (..); для i = 1: 1e5, out (i) = my_alg (fh, i, ...); end' – Amro

+0

Если вы хотите сделать это со всем кодом в том же файле, который был исходным запросом OP, я подозреваю, что накладные расходы функции (основной функции модуля), вызывающей другую функцию (заданную дескриптором) победит цель вопроса; не могли бы вы прокомментировать? Я согласен с тем, что обмен файлами в качестве решения является изящным, но я не уверен в повышении эффективности по сравнению с последовательным 'if' или' switch'. – Floris

+0

@Floris: извините за поздний ответ (не получил уведомление без «на имя пользователя»). Когда MATLAB разрешает подфункции функциональных вызовов (все в одном файле) имеют более высокий приоритет, чем внешние функции, так что может выполнить бит-бит быстрее. Встроенный код будет еще быстрее. Хотя я не думаю, что эффективность будет иметь большое значение здесь, так же как и удобочитаемость и хорошая организация кода, любое увеличение производительности здесь было бы крошечным, если таковое было. Разве вы так не думаете? – Amro

3

Поскольку Matlab использует компилятор только во времени, то, что вы предлагаете, может привести к непредвиденному последствию, что часть кода была скомпилирована для одного «режима», а затем оставлена ​​в памяти. В следующий раз, когда вы запустите его (если вы не закрыли Matlab и явно не забыли о функции), вы все равно будете использовать его в этом режиме, даже если вы намеревались его изменить. Я не думаю, что это можно сделать, и это хорошо ...

Если вам нужна скорость, есть намного лучшие способы ее достижения, чем удаление инструкции switch - что было бы моей предпочтительной альтернативой вашему (опять же, для удобочитаемости, если ничего другого).

switch (mode) 
    case 1: 
    % code of mode 1 
    case 2: 
    % code of mode 2 
    case 3: 
    % code of mode 3 
    otherwise: 
    % always trap the unexpected input!!! 
end 

Наконец - Вы, конечно, можете создать mex файл, который был условно скомпилирован с нужными опциями. Это фактически позволит вам делать именно то, о чем вы просите, и это добавило бы преимущество намного быстрее, чем собственный код Matlab. Вы можете передать #define команде mex с -D переключателем (см http://www.mathworks.com/help/matlab/ref/mex.html) - пример

mex -DmyMode=2 

Существует тонны материала по созданию MEX файлов в Интернете. Я предполагаю, что вы его найдете.