我正在尝试提高我的代码的性能。代码基本上计算L_total
(1x2640) 的值,并通过从另一个名为L_CN
(1320x6) 的变量中获取数据来完成。我还有colindexes
矩阵(2640x3),它存储要查看的行的值L_CN
。
所以,这是怎么回事,代码着眼于colindexes
获取行数据。Saycolindexes
具有以下形式:
55 65 75
68 75 85
...
该程序将L_total(1)
使用L_CN(55,1) + L_CN(65,1) + L_CN(75,1)
. 这里的第一个索引是指从colindexes
矩阵中获得的行号。第二个索引表示到目前为止这些行号的出现次数。因此,当我们计算 时L_total(2)
,它将是L_CN(68,1) + L_CN(75,2) + L_CN(85,1)
。这里L_CN(75,2)
发生是因为L_CN(75,1)
以前使用过。
要计算整个L_total
矩阵,下面的代码效果很好。它通过在名为 (2640x1) 的变量中增加相应索引来存储每个索引的出现次数list
,从而计算L_total
. 它在 0.023715 秒内完成。(注意n
下面是2640)
for i=1:n
list(colindexes(i,:)) = list(colindexes(i,:)) + 1;
L_total(i) = sum(diag(L_CN(colindexes(i,:),list(colindexes(i,:)))));
end
问题是,我将一遍又一遍地运行这部分代码,可能会运行一百万次。这是大型模拟的一部分。因此,即使是性能提升的最小部分也是我所追求的。首先,我认为摆脱 for 循环将用于此目的,并将代码切换为以下 - 从这个主题中获得一些帮助:出现次数的向量:
list_col = reshape(colindexes',1,[]);
occurrence = sum(triu(bsxfun(@eq,list_col,list_col.')));
list = reshape(occurrence,3,[])';
straight_index = colindexes + (list - 1)*k;
L_total = sum(L_CN(straight_index),2)';
此代码也适用于list_col
(1x7920)、occurrence
(1x7920)、list
(2640x3) 和straight_index
(2640x3)。然而,出乎我的意料,它需要 0.062168 秒,比 for 循环实现差大约三倍。此操作的 0.05217 秒是由于第二行,其中形成了出现矩阵。对于像我这样的数组大小,以这种方式查找出现的事件确实效率低下。
问题是,无论有没有 for 循环,我怎样才能提高这段代码的性能?向量化方法看起来不错,只要我能找到一种更快地计算出现矩阵的方法。正如我所说,这部分代码将运行很多次,因此任何百分比的性能提升都是受欢迎的。
谢谢!
更多信息:
colindexes
代表一个大小为 1320x2640 的大矩阵。我没有存储整个矩阵,而是仅将 '1' 的行位置存储在这个矩阵中colindexes
。其余为零。所以colindexes
我在问题中指定的意思是,第 1 列第 55 行和第 2 列第 85 行有一个“1”......所以最小,最大范围是 1,1320。每列只有 3 个 '1',所以它的大小是 2640x3。当然,这是关于它是如何形成的背景信息。如果这有帮助,则每个值的出现次数colindexes
也相同,即 6。
因此,对于矩阵A = [1 0 0 1; 0 1 1 0]
,colindexes
是[1; 2; 2; 1]
。