以下代码的矢量化有啥好处吗?
Posted
技术标签:
【中文标题】以下代码的矢量化有啥好处吗?【英文标题】:Is there any benefit to vectorization of following code?以下代码的矢量化有什么好处吗? 【发布时间】:2020-03-21 15:26:13 【问题描述】:for i=1:numResults
tempStructure=struct;
for j=1:options.numDates
stringJ=num2str(j);
[tempStructure.(['temp' stringJ]),tempStructure.(['tempHHI' stringJ])]=fillTemp(resultsStructure.(['results' stringJ]),resultsStructure.(['resultsHHI' stringJ]),options.resultSize,i);
end
end
在这里,我们可以假设resultStructure
在循环之前有字段(动态指定),并且每个字段都存在于resultStructure
中。
fillTemp
是一个复杂的函数,很难向量化。
在上面的代码中通过bsxfun
删除i
和j
的“for”循环以提高性能有什么好处吗?任何加速上述代码的替代方法也值得赞赏。
注意:我了解我定义和使用具有动态字段的结构的方式不是最佳解决方案,但这是一个可行的解决方案,我不想修改可行的解决方案。
我正在使用 MATLAB R2018a。
【问题讨论】:
您期望获得什么样的好处?表现?可读性?鲁棒性?矢量化代码通常更短,所以我想你可以期待更好的可读性。除此之外,要知道矢量化会产生什么好处的唯一方法就是去做,看看会发生什么。如果您试图确定是否值得花时间矢量化这段特定代码,答案取决于该特定部分相对于其他所有内容的执行情况。 感谢您的洞察力。我明白你的意思。请将此作为答案,以便我可以关闭此问题。 如果你想加速你的代码,你的首要任务应该是摆脱那些动态的字段名称。使用元胞数组来保存要使用数字索引的矩阵集。structure.tempHHIj
阅读起来更简单,效率也更高。对这段代码进行向量化是没有意义的,与索引成本相比,循环的成本是最小的。
【参考方案1】:
您似乎在这里问错了问题,原因如下:您的目标似乎是提高整个代码的性能,但由于某些未指明的原因,您决定专注于 特定部分,并尝试向其应用bsxfun
。根据这些信息,您似乎面临着所谓的an XY problem。
了解矢量化是件好事,但您应该记住,它只是用于此目的的众多技术中的一种(实际上是there's a whole book about it)。例如,您为什么不考虑parfor
1 或mex
?
程序员中的一句名言是“过早的优化是万恶之源。实际上,这意味着您应该首先确定程序中的瓶颈,然后然后考虑如何解决它们。第一部分可以使用profiler 完成(示例和附加说明here)。第二部分取决于您的代码细节(您的问题中没有足够详细,另请参阅:How to create a Minimal, Reproducible Example),因此很遗憾无法在此处给出一般性答案。
正如之前的评论中提到的,矢量化的好处可能是提高性能,并且在可能的情况下代码变得更短、更好的可读性和减少错误的可能性(即更长的代码往往会产生更多的错误,@987654329 @)。
附言
既然您提到您使用 R2018a,由于引入了 implicit expansion,bsxfun
甚至不再需要。
【讨论】:
以上是关于以下代码的矢量化有啥好处吗?的主要内容,如果未能解决你的问题,请参考以下文章