优化Matlab循环

6
我有一个计算直方图的代码循环,使用Matlab语言编写。由于我是Matlab的新手,我不知道还有哪些更快的方法可以实现此功能。目前我正在编写:
for i=1:size(b)
    a(b(i)) = a(b(i)) + 1;
end

有没有更快的方法来做这件事,最好不需要使用for循环?

3
总体评论:size 不适合您当前所做的操作,而应该使用lengthnumel - Gunther Struyf
2
认为for循环低效/慢并且应该尽可能替换的想法是没有根据的。即使您可以用更快的代码替换它,您也只能节省几分之一秒的时间。这不是您应该担心的代码优化水平。 - Kavka
@Kavka 关于这种类型的for循环,我同意。更复杂的for循环操作大型矩阵时值得进行向量化处理,对吧?Matlab是为矩阵设计的--它的所有矩阵操作都应该被优化。 - Derek
请参见http://www.mathworks.com/matlabcentral/newsreader/view_thread/10055。 - Ben Voigt
2个回答

9
您可以通过 a(b) = a(b) + 1 来简单地将其向量化。请参考以下内容:
>> a = [1 2 3 4];
>> b = [2 4]; %# indices to modify. Be sure that they are in bounds.
>> a(b) = a(b) + 1

a =

     1     3     3     5

如果您多次使用某些索引,则accumarray将以以下方式帮助您:
>> a = [1 2 3 4];
>> b = [2 4 2];
>> a = accumarray([1:numel(a) b].',[a ones(size(b))])'

a =

     1     4     3     5

另外,您还可以使用以下方法:

>> a = [1 2 3 4];
>> b = [2 4 2];
>> b = accumarray(b.',ones(size(b)));
>> a(nzIndex) = a(nzIndex) + b(nzIndex)'

a =

     1     4     3     5

请参阅此处的优秀答案,以获得更多详细信息。

在我的情况下,b 可能是 [2 4 2],所以我需要将 a(2) 增加两次。但是这种方法只会更新 a(2) 一次。 - anirudh

1
如果 ab 都是向量,那么这应该可以工作。
a = 1:100;
b = 100:-1:1;

a(b) = a(b) + 1;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接