加快寻找元素的累积发生

时间:2014-03-16 14:42:30

标签: performance matlab find-occurrences

我正在尝试提高代码的性能。代码基本上计算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}}。

1 个答案:

答案 0 :(得分:0)

如果您仍在使用for循环,请考虑将colindexes(i,:)存储在变量中。您正在使用4次。这样可以为您节省一些时间。