在MATLAB中类似ifdef的行为

时间:2013-04-19 03:11:31

标签: performance matlab

有没有办法在.m文件中创建在MATLAB编译时解析一次的代码片段?

例如,假设您有一段代码是模态的并且将被执行多次,但它将始终使用相同的模式。但是,为了便于阅读和轻松阅读代码,我希望在同一个文件中拥有所有不同的模式。

中的某些内容
if mode==1
  % code of mode 1
elseif mode==2
  % code of mode 2
elseif mode==3
  % code of mode 3
end

但是,如果这个文件被执行了数千次,我必须执行这个条件千次。但是对于每次运行,我将设置模式而不要更改它。

因此,我在考虑MATLAB是否有类似C的#ifdef行,其中我可以删除在执行中不会使用的所有其他部分。

2 个答案:

答案 0 :(得分: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代码快得多的额外优势。您可以使用mex开关将#define传递给-D命令(请参阅http://www.mathworks.com/help/matlab/ref/mex.html) - 示例

mex -DmyMode=2

在网络上创建mex文件有很多材料。我想你可以找到它。

答案 1 :(得分:3)

我认为您可以使用Strategy pattern

优雅地解决您的问题

考虑在代码中设置函数句柄 - 甚至在面向对象时制作策略对象。