我有一些功能代码,我试图通过消除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)矩阵。
答案 0 :(得分:3)
您可以使用accumarray
来执行此操作。尝试类似的东西:
meany = accumarray(bin(:),ydata(:),[],@mean);
standarddeviation = accumarray(bin(:),ydata(:),[],@std);