Labfans是一个针对大学生、工程师和科研工作者的技术社区。 | 论坛首页 | 联系我们(Contact Us) |
![]() |
|
![]() |
#1 |
高级会员
注册日期: 2019-11-21
帖子: 3,006
声望力: 66 ![]() |
![]()
我可以使用哪种语言功能或现成的hack来完成MATLAB中的函数内联?令人讨厌的是, 谷歌搜索“ matlab内联函数”时发现,MATLAB的设计师认为“内联”的意思是“从字符串中构造匿名函数”(... wtf?)。
我问的原因是我正在编写一个需要快速运行的脚本,并且遇到很多情况,最好有一个辅助函数来处理一些简单的加法或避免一次失误的事情。但是,函数调用的成本(以tic/toc衡量)是不值得的。我拒绝相信MATLAB缺少函数内联功能,因为那样会阻止分解! 最坏的情况是,我可以使用M4宏。 编辑:作为对eat的评论的回应,在这种情况下,我可能希望内联帮助器: 一方面,我需要在列表中所有宽度为windowWidth窗口上循环(是的,我知道): lastWindowStartIdx = length(list) - windowWidth + 1; for windowStartIdx = 1:lastWindowStartIdx display(list[windowStartIdx:windowStartIdx+windowWidth-1]); %the window we're looking at end 能够排除那些棘手的,容易出错的windowWidth计算,将是一个很好的选择。例如: lastWindowStartIdx = calcLastWindowStartIdx(length(list), windowWidth); for windowStartIdx = 1:lastWindowStartIdx display(list[windowStartIdx:calcWindowEndIdx(windowStartIdx, windowWidth)]); %the window we're looking at end 回答: 具体答案: 关于您的示例用例,老实说,这是一种微优化。这些加一运算当然不是阻止其快速运行的瓶颈,因此,您应该专注于加快执行大量计算的代码部分。 如果您只是出于美学考虑(第一次尝试就拼写了!),或者只是因为不想跟踪多余的原因而进行此更改,则创建一个函数来处理它(如您的示例中所示)我认为这是个错误的选择,因为这只会使代码更难阅读和理解。我建议简单地像这样创建一个新变量: windowOffset = windowWidth - 1; lastWindowStartIdx = length(list) - windowOffset; for windowStartIdx = 1:lastWindowStartIdx display(list[windowStartIdx:windowStartIdx + windowOffset]); end 一般回答: 关于您关于如何像在C或C ++中那样在MATLAB中创建真正的内联函数的更一般性的问题,我认为没有任何方法可以做到这一点。我以为匿名函数也许很合适,但是在MATLAB中对许多不同类型的函数进行了一些简单的时序比较之后,我发现对于一个简单的+1操作,匿名函数实际上要比好的ol' 子函数慢。 这是我测试的示例函数: 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 我运行了这100,000次中的每一次,以从1开始的标量值递增,结果如下: | Time (sec) ------------+------------ subfunction | 0.0507 anonymous | 0.0672 nested | 0.0932 inline | 14.7095 如果匿名函数像真正的内联函数那样工作,我希望它们是最快的解决方案。 更多&回答... |
![]() |
![]() |