📄 matlab向量化操作的又一重要函数accumarray.txt
字号:
向量化操作的又一重要函数accumarray的用法总结2008年05月04日 星期日 18:10向量化操作的又一重要函数accumarray的用法总结
向量化编程是MATLAB编程区别于其他语言的最重要特征之一,MATLAB不断增强其向量化编程的能力。版本7以后出现的accumarray函数就是一个很好的例子。
accumarray函数最早出现于7.0版(R14),在随后的7.1 (R14SP3), 7.2 (R2006a)版里又对其功能进行增强。大家可以在帮助文档里了解其基本信息,这里结合自己的使用经验给出其用法的举例,大家可以看看其效果。
例1:生成一个100000*1的向量,其元素服从[1,100000]之间离散均匀分布,找出都有哪些元素出现了
a=unidrnd(100000,100000,1);
方法1:
tic;b=union(a,a);toc;
Elapsed time is 0.077001 seconds.
方法2:
tic;c=unique(a);toc;
Elapsed time is 0.035060 seconds.
方法3
tic,d=accumarray(a,1,[100000,1]);e=find(d);toc
Elapsed time is 0.016507 seconds.
d 给出了每个元素出现的个数,如果还需要这方面的信息,无疑方法3占绝对优势。
例2:在1000*1000的正方形区域内随机生成100000个点(坐标值是整数),统计每个坐标点上生成的点的个数。
在这个例子下,像例1一样简单应用union和unique就不行了。通常我们考虑用循环:
p=unidrnd(1000,100000,2);
tic;
A=zeros(1000);
for k=1:100000
A(p(k,1),p(k,2))=A(p(k,1),p(k,2))+1;
end
toc
Elapsed time is 0.399575 seconds.
而用accumarray,可以这样:
>> tic;a=accumarray(p,1,[1000,1000]);toc
Elapsed time is 0.038169 seconds.
>> isequal(A,a)
ans =
1
速度整整提高了10倍。
例3:1000人,身高分布在170-180,体重在110-200斤,年龄分布在20-50岁,计算身高体重都相等的人的年龄平均值。结果用矩阵表示:
行数表示身高,列数表示体重,元素表示年龄的平均值。
首先生成数据:
rand('state',0)
height=unidrnd(10,1000,1)+170;
rand('state',0)
weight=unidrnd(90,1000,1)+110;
rand('state',0)
old=unidrnd(30,1000,1)+20;
利用accumarray计算的语句如下:
tic;mo=accumarray([height,weight],old,[],@mean);toc
Elapsed time is 0.005170 seconds.
这个矩阵比较稀疏也可以结果用稀疏矩阵来表示
tic;mo=accumarray([height,weight],old,[],@mean,0,true);toc
Elapsed time is 0.005312 seconds.
维数大后,稀疏矩阵会有优势,这个例子还不明显。
大家有兴趣可以试试传统方法效果。
以上仅举了三个例子,实际上,accumaary的应用方法非常灵活,尤其是对于很多要操作大矩阵的情况下。大家可以仔细看看帮助文档
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -