在我的函数中,有很多元素明智的矩阵乘法是独立的。有没有办法同时计算它们?
所有这些都是非常简单的操作,但是我运行时间的70%用于代码的这些部分,因为这个函数被调用了数百万次。
function [r1,r2,r3]=backward(A,B,C,D,E,F,r1,r2,r3)
r1=A.*B;
r2=C.*D;
r3=E*F;
end
for i=1:300
[r1,r2,r3]=backward(A,B,C,D,E,F,r1,r2,r3)
end
答案 0 :(得分:0)
编辑:在写完答案后,我发现你没有通过矩阵乘法将所有输入矩阵相乘。其中一些是元素乘法。如果这是您的意图,则以下答案将不适用。
您正在寻找用于计算多个矩阵的乘积的最优算法。人们很久以前就研究过这个问题,他们提出了动态编程算法来决定最优顺序。
例如,如果A
的大小为10000 x 1
,B
的大小为1 x 10000
且C
的大小为10000 x 1
,则为如果我们将A*B*C
计算为A*(B*C)
而不是(A*B)*C
,那么效率会更高。这种技术的正确性证明在于矩阵乘法是相关的。您可以阅读有关此on Wikipedia的更多信息。
如果你想要一个高质量的MATLAB实现,你可以找到它here。它将矩阵作为输入并给出产品。看起来这个实现在寻找计算“最多”10个矩阵的最佳方法方面做得不错。
答案 1 :(得分:0)
首先要注意的是:您提供的最后3个变量不会被使用。我不认为这会很重要,但清理它会更好。
现在的答案是:
MATLAB是关于矩阵运算的,它已经过高度优化。即使使用C ++,您也不会期望显着的加速(并且对减速保持警惕)。因此,根据问题中提供的信息,结论是您无法做任何事情来加速独立矩阵计算。
话虽如此:如果你可以减少顺序函数调用的次数,可能会有所收获。
一般来说很难说如何做到这一点,但有两个想法:
for
循环中调用函数,请使用parfor
循环(假设你有并行处理工具箱,否则手动拆分循环并打开4个matlab实例以对循环进行并行化) (如果需要,可以是automated。)