MATLAB:使用矢量化查找已排序数据的统计信息

时间:2012-01-17 18:05:30

标签: matlab vectorization

我有一些功能代码,我试图通过消除for循环来加快速度。

我有一组x,y对的数据作为两个向量,因此x(k)和y(k)形成一对。我也有一组bin边(xe)。对于每个bin j,在该bin中存在一组x值,由xe(j)< = x(k)< XE(J + 1)。对于每个bin,我想找到该bin中所有y(k)与x(k)的平均值和标准差。

完成此任务的MATLAB代码如下:

[meany, standardeviation] = ystatsvsx (xdata, ydata, xe)

meany = zeros([size(ydata,1) (length(xe)-1)]);
standarddeviation = meany;   
[numx,bin] = histc(xdata, xe);
for j = 1:(length(xe) - 1)
   inds = bin == j;
   meany(j) = mean(ydata(inds));
   standarddeviation(j) = std(ydata(inds));
end

当xe很大时,此功能变慢。有没有人有任何关于如何矢量化此代码以消除for循环的建议?给定箱(numx)中的数据点数是可变的。

一个警告:长度(xe)*长度​​(xdata)在这些情况下非常大(长度(xdata)总是远大于长度(xe)),因此不可能使用repmat来创建长度( xe)x length(xdata)矩阵。

1 个答案:

答案 0 :(得分:3)

您可以使用accumarray来执行此操作。尝试类似的东西:

meany = accumarray(bin(:),ydata(:),[],@mean);
standarddeviation = accumarray(bin(:),ydata(:),[],@std);