Performance MATLAB中的类ifdef行为
是否有一种方法可以在Performance MATLAB中的类ifdef行为,performance,matlab,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 然而,如果这个文件被执行了一千次,我就必须执行这个有条件的文件一千次。但
.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
行,我可以去掉执行中不使用的所有其他部分。因为MATLAB使用的是实时编译器,您的建议可能会导致意外的结果,即一段代码被编译为一种“模式”,然后留在记忆中。下次运行它时(如果没有关闭matlab并且没有明确“忘记”函数),您仍将在该模式下使用它-即使您打算更改它。我认为这是不可能的,这是一件好事
如果您需要速度,有比删除switch
语句更好的方法来实现它,这将是我首选的替代方法(同样,为了可读性,如果没有其他方法的话)
最后,您当然可以创建一个mex
文件,该文件使用正确的选项进行有条件编译。这实际上允许您完全按照自己的要求进行操作,并且它还有一个额外的优势,即比原生Matlab代码快得多。您可以使用-D
开关将#define传递给mex
命令(请参阅)-示例
mex -DmyMode=2
有大量关于在web上创建mex文件的资料。我想你可以找到它。因为Matlab使用的是实时编译器,你的建议可能会导致意外的结果,即一段代码被编译为一种“模式”,然后留在内存中。下次运行它时(如果没有关闭matlab并且没有明确“忘记”函数),您仍将在该模式下使用它-即使您打算更改它。我认为这是不可能的,这是一件好事 如果您需要速度,有比删除
switch
语句更好的方法来实现它,这将是我首选的替代方法(同样,为了可读性,如果没有其他方法的话)
最后,您当然可以创建一个mex
文件,该文件使用正确的选项进行有条件编译。这实际上允许您完全按照自己的要求进行操作,并且它还有一个额外的优势,即比原生Matlab代码快得多。您可以使用-D
开关将#define传递给mex
命令(请参阅)-示例
mex -DmyMode=2
有大量关于在web上创建mex文件的资料。我想你能找到它。我想你可以用一个
如果你喜欢面向对象,可以考虑在代码中设置一个函数句柄,或者甚至创建策略对象。我认为使用
考虑在代码中设置函数句柄,或者如果您喜欢面向对象,甚至可以创建策略对象。+1您将创建一个
select\u实现
函数,该函数将函数句柄返回到可能的实现之一@func1、@func2、…
(每个实现都在一个单独的M文件中)。这将被调用一次,返回的函数句柄将传递给执行迭代的实际调用:fh=select\u实现(…);对于i=1:1e5,out(i)=my_alg(fh,i,…);结束
如果您想对同一文件中的所有代码执行此操作-这是OP的原始请求-我怀疑函数(模块的主函数)调用另一个函数(由句柄给定)的开销会破坏问题的目的;你想评论一下吗?我同意将交换文件句柄作为一种解决方案是很优雅的,但我不相信与顺序if
或switch
@Floris相比效率的提高。很抱歉,回复太晚(没有“at username”这件事,我没有得到通知)。当MATLAB解析函数调用时,子函数(全部在一个文件中)比外部函数具有更高的优先级,因此执行速度可能会稍微快一点。内联代码会更快。虽然我不认为这里的效率比可读性和良好的代码组织更重要,但是这里的任何性能提升都是微乎其微的。“你不这么认为吗?”阿诺-我同意。我提倡干净的代码(可维护的,不太可能出现错误),而不是“快速但晦涩”的代码;这些变化很可能会有很小的速度差异。+1您将创建一个select_实现
函数,该函数返回一个函数句柄到一个可能的实现@func1、@func2、…
(每个实现都在一个单独的M文件中)。这将被调用一次,返回的函数句柄将传递给执行迭代的实际调用:fh=select\u实现(…);对于i=1:1e5,out(i)=my_alg(fh,i,…);结束
如果您想对同一文件中的所有代码执行此操作-这是OP的原始请求-我怀疑函数(模块的主函数)调用另一个函数(由句柄给定)的开销会破坏问题的目的;你想评论一下吗?我同意将交换文件句柄作为一种解决方案是很优雅的,但我不相信与顺序if
或switch
@Floris相比效率的提高。很抱歉,回复太晚(没有“at username”这件事,我没有得到通知)。当MATLAB解析函数调用时,子函数(全部在一个文件中)比外部函数具有更高的优先级,因此执行速度可能会稍微快一点。