Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance MATLAB中的类ifdef行为_Performance_Matlab - Fatal编程技术网

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解析函数调用时,子函数(全部在一个文件中)比外部函数具有更高的优先级,因此执行速度可能会稍微快一点。