我正在尝试提高代码的性能。代码基本上计算L_total
(1x2640)的值,它通过从另一个名为L_CN
(1320x6)的变量中获取数据来完成。我还有colindexes
矩阵(2640x3),它存储要在L_CN
中查看的行的值。
所以,这是怎么回事,代码查看colindexes
来获取行数据。说colindexes
具有以下形式:
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
。
要计算整个list
矩阵,以下代码效果很好。它通过在名为L_total
(2640x1)的变量中递增相应的索引来存储每个索引的出现次数,从而计算n
。它在0.023715秒内完成。 (请注意for i=1:n
list(colindexes(i,:)) = list(colindexes(i,:)) + 1;
L_total(i) = sum(diag(L_CN(colindexes(i,:),list(colindexes(i,:)))));
end
下面是2640)
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)';
问题是,我将一遍又一遍地运行这部分代码,可能就像一百万次。这是大模拟的一部分。因此,即使是性能提升的最小部分也是我追求的目标。首先,我认为摆脱for循环将用于此目的并将代码转换为以下内容 - 从这个主题获得一点帮助:Vector of the occurence number:
list_col
此代码也可以完成occurrence
(1x7920),list
(1x7920),straight_index
(2640x3)和colindexes
(2640x3)的工作。但是,与我的期望相反,它需要0.062168秒,比for循环实现差三倍。该操作的0.05217秒是由第二行引起的,其中形成了出现矩阵。对于像我这样的数组大小,以这种方式找到事件是非常低效的。
问题是,无论是否有for循环,我如何才能提高此代码的性能?矢量化方法似乎很好,只要我能找到一种更快地计算出现矩阵的方法。正如我所说,这部分代码将运行很多次,因此欢迎任何增加性能的百分比。
谢谢!
更多信息:
colindexes
代表一个大小为1320x2640的大矩阵。我只存储colindexes
中此矩阵中'1'的行位置,而不是存储整个矩阵。剩下的就是零。所以我在问题中指定的colindexes
意味着,在第一列第55行和第二列第85行中有一个'1'所以最小,最大范围是1,1320。每列只有3'1,因此它的大小为2640x3。当然,这是关于它是如何形成的背景信息。如果这有帮助,A = [1 0 0 1; 0 1 1 0]
中每个值的出现次数也是相同的,即6。
因此,对于矩阵colindexes
,[1; 2; 2; 1]
为{{1}}。
答案 0 :(得分:0)
如果您仍在使用for循环,请考虑将colindexes(i,:)
存储在变量中。您正在使用4次。这样可以为您节省一些时间。