【发布时间】:2014-03-16 14:42:29
【问题描述】:
我正在尝试提高我的代码的性能。代码基本上计算L_total (1x2640) 的值,它通过从另一个名为L_CN (1320x6) 的变量中获取数据来完成。我还有colindexes 矩阵(2640x3),它存储要在L_CN 中查看的行的值。
所以,这是怎么回事,代码查看colindexes 以获取行数据。假设colindexes 的形式如下:
55 65 75
68 75 85
...
程序将使用L_CN(55,1) + L_CN(65,1) + L_CN(75,1) 计算L_total(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(2640x1) 的变量中的相应索引来存储每个索引的出现次数,从而计算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 循环将用于此目的,并将代码转换为以下 - 从这个主题中获得一些帮助:Vector of the occurence number:
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]。
【问题讨论】:
-
2640x1。让我编辑 OP。
-
n会是什么?对不起,如果我错过了。 -
没关系,这是一个巨大的代码,我将发布其中的一部分。我可能已经跳过指定一个或两个变量。 n 是 2640,我也会编辑它。
-
您能否发布典型值,以及
L_CN、list和colindexes的最小值和最大值? -
colindexes代表一个大小为 1320x2640 的大矩阵。我没有存储整个矩阵,而是仅将 '1' 的行位置存储在该矩阵中colindexes中。其余为零。所以colindexes我在问题中指定的意思是,在第 1 列第 55 行和第 2 列第 85 行中有一个“1”......所以最小,最大范围是 1,1320。每列只有 3 个 '1',所以它的大小是 2640x3。当然,这是关于它是如何形成的背景信息。如果这有帮助,colindexes中每个值的出现次数也相同,即 6。
标签: performance matlab find-occurrences