后续代码的向量化有什么好处?

时间:2019-11-26 08:54:22

标签: matlab performance for-loop struct vectorization

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是一个复杂的函数,很难向量化。

通过上述代码中的i来删除jbsxfun的“ for”循环是否有任何好处,以提高性能?任何加快上述代码速度的替代方法也将受到赞赏。

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

我正在使用MATLAB R2018a。

1 个答案:

答案 0 :(得分:1)

您似乎在这里问错了问题,这是为什么:看来您的目标是改善整个代码的性能,但出于某些未指明的原因,您决定专注于特定部分,并尝试对其应用bsxfun 。根据这些信息,您似乎正面临着an XY problem

知道矢量化是一件好事,但是您应该记住,它只是为此目的有用的许多技术之一(实际上是there's a whole book about it)。例如,为什么不考虑使用parfor 1 mex

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

如前一条评论中所述,矢量化的好处可以提高性能,并且在可能的情况下,代码变得更短,可读性更好,并且降低了错误发生的可能性(例如,较长的代码往往会产生更多的错误,对于{{ 3}})。

PS
就像您提到的那样,您使用过R2018a,bsxfun甚至由于引入了constant "bugs per line-of-code"而变得不再必要。