Performance 加快查找元素的累计出现次数

Performance 加快查找元素的累计出现次数,performance,matlab,find-occurrences,Performance,Matlab,Find Occurrences,我正在努力提高代码的性能。代码基本上计算L\u total(1x2640)的值,并通过从另一个名为L\u CN(1320x6)的变量获取数据来实现。我还有colindexes矩阵(2640x3),它存储了要在L\u CN中查看的行的值 因此,代码查看colindexes以获取行数据。假设colindexes的形式如下: 55 65 75 68 75 85 ... 程序将使用L_CN(55,1)+L_CN(65,1)+L_CN(75,1)计算L_总数(1)。这里,第一个索

我正在努力提高代码的性能。代码基本上计算
L\u total
(1x2640)的值,并通过从另一个名为
L\u CN
(1320x6)的变量获取数据来实现。我还有
colindexes
矩阵(2640x3),它存储了要在
L\u CN
中查看的行的值

因此,代码查看
colindexes
以获取行数据。假设
colindexes
的形式如下:

55    65    75
68    75    85
...
程序将使用
L_CN(55,1)+L_CN(65,1)+L_CN(75,1)
计算L_总数(1)。这里,第一个索引是指从
colindexes
矩阵中获得的行号。第二个索引表示到目前为止这些行号的出现次数。因此,当我们计算
L_总数(2)
时,它将是
L_CN(68,1)+L_CN(75,2)+L_CN(85,1)
。这里发生的
L\u-CN(75,2)
是因为
L\u-CN(75,1)
以前被使用过

要计算整个
L_total
矩阵,以下代码运行良好。它通过在名为
list
(2640x1)的变量中增加相应的索引来存储每个索引的出现次数,从而计算
L_total
。它在0.023715秒内完成。(请注意,
n
是下面的2640)

问题是,我会一遍又一遍地运行这部分代码,可能会运行一百万次。这是大型模拟的一部分。因此,即使是业绩增长的一小部分也是我所追求的。首先,我认为摆脱for循环可以达到这个目的,并将代码转换为以下内容-从本主题中获得一些帮助::

此代码还执行
list\u col
(1x7920)、
occurrence
(1x7920)、
list
(2640x3)和
直线索引(2640x3)的工作。然而,与我的预期相反,它需要0.062168秒,大约是for循环实现的三倍。此操作的0.05217秒应在第二行完成,在该行中形成发生矩阵。对于像我这样的数组大小,以这种方式查找事件的效率确实很低

问题是,无论是否使用for循环,如何提高代码的性能?矢量化方法看起来不错,只要我能找到一种更快计算发生矩阵的方法就好了。正如我所说的,这部分代码将运行很多次,因此性能的任何提高都是受欢迎的

谢谢大家!

进一步资料:
共索引
表示大小为1320x2640的大矩阵。我没有存储整个矩阵,而是将矩阵中“1”的行位置存储在
colindexes
中。剩下的是零。因此,问题中指定的
colindexes
I意味着,第1列第55行和第2列第85行中有一个“1”。。。所以最小,最大范围是11320。每列中只有3'1,因此其大小为2640x3。当然,这是关于它是如何形成的背景信息。如果这有帮助,则
colindexes
中每个值的出现次数也相同,即6


<> P> >对于矩阵<代码> A=(1 0 0 0;0 1 1 0)< /代码>,<代码> Cal指标< /C> > <代码> [1;2;2;1 ] < /> >

如果您仍在使用for循环,请考虑在变量中存储<代码> CysRead(i,,)/Cuth>。你已经用了4次了。这可能会稍微节省您的时间。

2640x1。让我来编辑OP.
n
会是什么?对不起,如果我错过了。没关系,这是一个巨大的代码,我张贴它的一部分。我可能跳过了指定一两个变量。n是2640,我也会编辑它。你能发布典型的值吗?也许
L_CN
list
colindexes
colindexes
代表一个1320x2640大小的大矩阵。我没有存储整个矩阵,而是将矩阵中“1”的行位置存储在
colindexes
中。剩下的是零。因此,问题中指定的
colindexes
I意味着,第1列第55行和第2列第85行中有一个“1”。。。所以最小,最大范围是11320。每列中只有3'1,因此其大小为2640x3。当然,这是关于它是如何形成的背景信息。如果这有帮助,则
colindexes
中每个值的出现次数也相同,即6。
for i=1:n
     list(colindexes(i,:)) = list(colindexes(i,:)) + 1;
     L_total(i) = sum(diag(L_CN(colindexes(i,:),list(colindexes(i,:)))));
end
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)';