有没有办法在MATLAB中执行函数内联?

Alc*_*ive 4 syntax macros matlab inline function

我可以使用什么语言功能或开箱即用的黑客来完成MATLAB中的函数内联?令人讨厌的是,Google搜索"matlab内联函数"表明,MATLAB的设计者认为"内联"意味着"用字​​符串构造一个匿名函数"(... wtf?).

我问的原因是我正在编写一个需要快速运行的脚本,而且我遇到很多情况,让一个帮助函数处理一些简单的添加或者某些东西来避免一个一个错误.但是,函数调用的成本(以度量衡量tic/toc)是不值得的.我拒绝相信MATLAB缺少函数内联功能,因为这会阻止分解!

最糟糕的情况是,我可以使用M4宏.


编辑:回应吃的评论,这里是一个我可能想要帮助内联的情况:

有一次,我需要windowWidth在列表中的所有宽度窗口上循环(是的,我知道):

lastWindowStartIdx = length(list) - windowWidth + 1;
for windowStartIdx = 1:lastWindowStartIdx
   display(list[windowStartIdx:windowStartIdx+windowWidth-1]); %the window we're looking at
end
Run Code Online (Sandbox Code Playgroud)

如果能够分解那些棘手的,逐个错误的windowWidth计算,那将是很好的.例如:

lastWindowStartIdx = calcLastWindowStartIdx(length(list), windowWidth);
for windowStartIdx = 1:lastWindowStartIdx
   display(list[windowStartIdx:calcWindowEndIdx(windowStartIdx, windowWidth)]); %the window we're looking at
end
Run Code Online (Sandbox Code Playgroud)

gno*_*ice 9

具体答案:

在您的示例用例中,这实际上让我觉得它是一种微优化.这些加一运算肯定不是代码中的瓶颈,使其无法快速运行,因此您应该专注于加速代码中进行大量计算的部分.

如果你只是想在美学上做出这种改变(在第一次尝试拼写它!)的原因,或者因为你不喜欢跟踪额外的那些,那么创建一个函数来处理它就像你的例子中一样在我看来,糟糕的选择,因为它只是使代码更难阅读和理解.我建议简单地创建一个新变量,如下所示:

windowOffset = windowWidth - 1;
lastWindowStartIdx = length(list) - windowOffset;
for windowStartIdx = 1:lastWindowStartIdx
   display(list[windowStartIdx:windowStartIdx + windowOffset]);
end
Run Code Online (Sandbox Code Playgroud)

一般答案:

关于如何在MATLAB中创建真正的内联函数的更一般的问题,就像在C或C++中一样,我不相信有任何方法可以做到这一点.我想也许匿名函数可能适合这个法案,但是在对MATLAB中许多不同类型的函数进行一些简单的时序比较之后,我发现匿名函数实际上比一个简单的+1 子函数慢的子函数慢.

以下是我测试的示例函数:

function parent_function
  add_one_anon = @(A) A+1;         %# An anonymous function
  add_one_inline = inline('A+1');  %# An "inline" function
  function add_one_nest            %# A nested function
    A = A+1;
  end
  %# Did the timing here ...
end
function A = add_one_sub(A)        %# A subfunction
  A = A+1;
end
Run Code Online (Sandbox Code Playgroud)

我运行了这些100,000次,每次增加一个从1开始的标量值,结果如下:

            | Time (sec)
------------+------------       
subfunction |   0.0507
anonymous   |   0.0672
nested      |   0.0932
inline      |  14.7095
Run Code Online (Sandbox Code Playgroud)

如果匿名函数的行为与真正的内联函数相同,我原本期望它们是最快的解决方案.

  • 在Matlab JIT中进行泛化内联可能非常困难,因为实际调度的函数取决于所有输入变量的类型以及特定函数调用时Matlab路径的状态. (2认同)