哪些bin在MatLab的3D直方图中被占用



我得到了3D数据,我需要从中计算属性。为了减少计算量,我想将空间离散化,并从Bin中计算属性,而不是从单个数据点中计算,然后将从Bin中计算出的属性重新分配回数据点。我进一步只想计算有点在里面的箱子。由于在MatLab中没有3d分类函数,我所做的是在每个维度上使用历史计数,然后搜索已分配给数据点的唯一bin。

a5pre=compositions(:,1);
a7pre=compositions(:,2);
a8pre=compositions(:,3);
%% BINNING
a5pre_edges=[0,linspace(0.005,0.995,19),1];
a5pre_val=(a5pre_edges(1:end-1) + a5pre_edges(2:end))/2;
a5pre_val(1)=0;
a5pre_val(end)=1;
a7pre_edges=[0,linspace(0.005,0.995,49),1];
a7pre_val=(a7pre_edges(1:end-1) + a7pre_edges(2:end))/2;
a7pre_val(1)=0;
a7pre_val(end)=1;
a8pre_edges=a7pre_edges;
a8pre_val=a7pre_val;
[~,~,bin1]=histcounts(a5pre,a5pre_edges); 
[~,~,bin2]=histcounts(a7pre,a7pre_edges); 
[~,~,bin3]=histcounts(a8pre,a8pre_edges); 
bins=[bin1,bin2,bin3];
[A,~,C]=unique(bins,'rows','stable');
a5pre=a5pre_val(A(:,1));
a7pre=a7pre_val(A(:,2));
a8pre=a8pre_val(A(:,3));

似乎唯一的函数是相当耗时的,所以我想知道是否有一个更快的方法来做到这一点,知道这行只能包含整数左右…或者完全不同。

问好
function [comps,C]=compo_binner(x,y,z,e1,e2,e3,v1,v2,v3)
C=NaN(length(x),1);
comps=NaN(length(x),3);
id=1;
for i=1:numel(x)
B_temp(1,1)=v1(sum(x(i)>e1));
B_temp(1,2)=v2(sum(y(i)>e2));
B_temp(1,3)=v3(sum(z(i)>e3));
C_id=sum(ismember(comps,B_temp),2)==3;
if  sum(C_id)>0
C(i)=find(C_id);
else
comps(id,:)=B_temp;
id=id+1;
C_id=sum(ismember(comps,B_temp),2)==3;
C(i)=find(C_id>0);
end
end
comps(any(isnan(comps), 2), :) = [];

end

但它比历史计数慢得多,唯一的版本。不能避免find-function,当它与速度有关时,你肯定要避免在循环中使用这个函数…

如果我理解正确的话,您想要计算3D直方图。如果没有内置的工具来计算,那么编写一个也很简单:

function [H, lindices] = histogram3d(data, n)
% histogram3d   3D histogram
%    H = histogram3d(data, n) computes a 3D histogram from (x,y,z) values
%    in  the Nx3 array `data`. `n` is the number of bins between 0 and 1.
%    It is assumed all values in `data` are between 0 and 1.
assert(size(data,2) == 3, 'data must be Nx3');
H = zeros(n, n, n);
indices = floor(data * n) + 1;
indices(indices > n) = n;
lindices = sub2ind(size(H), indices(:,1), indices(:,2), indices(:,3));
for ii = 1:size(data,1)
H(lindices(ii)) = H(lindices(ii)) + 1;
end
end

现在,给定您的compositions数组,并将每个维度分成20个箱子,我们得到:

[H, indices] = histogram3d(compositions, 20);
idx = find(H);
[x,y,z] = ind2sub(size(H), idx);
reduced_compositions = ([x,y,z] - 0.5) / 20;

H的bin中心在((1:20)-0.5)/20

在我的机器上,对于500万个输入点,这只需要几分之一秒。

现在,对于每个composition(ii,:),您有一个数字indices(ii),它与另一个数字idx[jj]相匹配,对应于reduced_compositions(jj,:)。对结果进行赋值的一种简单方法如下:

H(H > 0) = 1:numel(idx);
indices = H(indices);

现在对于每个composition(ii,:),你在约简集中最接近的匹配是reduced_compositions(indices(ii),:)

相关内容

  • 没有找到相关文章

最新更新