以下代码的矢量化有啥好处吗?

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 删除ij 的“for”循环以提高性能有什么好处吗?任何加速上述代码的替代方法也值得赞赏。

注意:我了解我定义和使用具有动态字段的结构的方式不是最佳解决方案,但这是一个可行的解决方案,我不想修改可行的解决方案。

我正在使用 MATLAB R2018a。

【问题讨论】:

您期望获得什么样的好处?表现?可读性?鲁棒性?矢量化代码通常更短,所以我想你可以期待更好的可读性。除此之外,要知道矢量化会产生什么好处的唯一方法就是去做,看看会发生什么。如果您试图确定是否值得花时间矢量化这段特定代码,答案取决于该特定部分相对于其他所有内容的执行情况。 感谢您的洞察力。我明白你的意思。请将此作为答案,以便我可以关闭此问题。 如果你想加速你的代码,你的首要任务应该是摆脱那些动态的字段名称。使用元胞数组来保存要使用数字索引的矩阵集。 structure.tempHHIj 阅读起来更简单,效率也更高。对这段代码进行向量化是没有意义的,与索引成本相比,循环的成本是最小的。 【参考方案1】:

您似乎在这里问错了问题,原因如下:您的目标似乎是提高整个代码的性能,但由于某些未指明的原因,您决定专注于 特定部分,并尝试向其应用bsxfun。根据这些信息,您似乎面临着所谓的an XY problem。

了解矢量化是件好事,但您应该记住,它只是用于此目的的众多技术中的一种(实际上是there's a whole book about it)。例如,您为什么不考虑parfor1mex

程序员中的一句名言是“过早的优化是万恶之源。实际上,这意味着您应该首先确定程序中的瓶颈,然后然后考虑如何解决它们。第一部分可以使用profiler 完成(示例和附加说明here)。第二部分取决于您的代码细节(您的问题中没有足够详细,另请参阅:How to create a Minimal, Reproducible Example),因此很遗憾无法在此处给出一般性答案。

正如之前的评论中提到的,矢量化的好处可能是提高性能,并且在可能的情况下代码变得更短、更好的可读性和减少错误的可能性(即更长的代码往往会产生更多的错误,@987654329 @)。

附言 既然您提到您使用 R2018a,由于引入了 implicit expansion,bsxfun 甚至不再需要。

【讨论】:

以上是关于以下代码的矢量化有啥好处吗?的主要内容,如果未能解决你的问题,请参考以下文章

不同量化电平数对信号有啥影响

我可以只为代码的一部分启用矢量化吗?

gcc、clang 和 msvc 的 C++ 自动矢量化要求

有啥方法可以安全地进行图像量化且无需编组?

你能调试自动矢量化循环吗?

python 开源量化平台 vn.py有啥用