Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
不连续区间的matlab-histc_Matlab_Histogram - Fatal编程技术网

不连续区间的matlab-histc

不连续区间的matlab-histc,matlab,histogram,Matlab,Histogram,在过去的几天里,我一直被这个问题困扰着!因此,任何帮助都将不胜感激 问题是: 我有一个巨大的不连续区间列表,大约80000个,分布在100万到2.5亿之间。我有一组更大的数字(大约2亿个元素的向量)分布在相同的范围内,即1到2.5亿。似乎这还不够复杂,这些间隔中的一些可能会重叠,但大多数都是不连续的 现在,我想做一个直方图计数,计算向量中有多少元素落在每个间隔内。如果这些只是连续的间隔(没有间隙),那么可以使用histc。即使保证间隔总是不连续的(即有间隙),我仍然可以使用histc并抛出间隙

在过去的几天里,我一直被这个问题困扰着!因此,任何帮助都将不胜感激

问题是:


我有一个巨大的不连续区间列表,大约80000个,分布在100万到2.5亿之间。我有一组更大的数字(大约2亿个元素的向量)分布在相同的范围内,即1到2.5亿。似乎这还不够复杂,这些间隔中的一些可能会重叠,但大多数都是不连续的

现在,我想做一个直方图计数,计算向量中有多少元素落在每个间隔内。如果这些只是连续的间隔(没有间隙),那么可以使用histc。即使保证间隔总是不连续的(即有间隙),我仍然可以使用histc并抛出间隙中的计数。但是,由于我不能保证时间间隔总是不连续的,我被难住了

到目前为止,我尝试了两种方法来解决这个问题:


1) 只需在间隔之间循环,然后进行sum(vector>=start&vector如何
bsxfun

sum(bsxfun(@gt, vector(:), start(:).') & bsxfun(@le, vector(:), stop(:).'))
如果内存有限,则可能需要将
向量
分块并对所有部分结果求和:

chunksize = 1e4; %// set as allowed by your memory
total = zeros(1,length(start)); %// initiallize
vector = vector(:); %// make column vector
for cut = 1:chunksize:length(vector)
    total = total + sum(bsxfun(@gt, vector(cut+(0:chunksize-1)), start(:).') & bsxfun(@le, vector(cut+(0:chunksize-1)), stop(:).'));
end

由于您的数字比间隔多得多,因此最好的方法是选择尽可能快的解决方案来处理所有数字,这可能是通过使用
histc
(用C编写)然后对间隔和直方图计数进行任意多的预处理和后处理,因为在这些方面花费的任何时间都可以忽略不计

我的想法是将区间的所有起始边和终止边放在一个排序向量
边中,删除所有重复的边,然后对这些边执行
历史记录
。要获得每个区间的总计数,只需将区间两侧的索引查找到
向量中,并将所有的索引相加即可形成间隔的单个存储箱(由于重叠,原始间隔可能被分割成多个存储箱)。类似这样的内容(未测试):

如果数字的数量太大,无法放入内存(可能是从文件中读取的),则可以直接分块进行直方图计算(伪代码):


假设这是可行的,这个解决方案应该使用与
max(chunksize,ninterval)
成比例的内存量,这比Luis和Oleg的解决方案要少得多。我想总运行时间只受
histc

的速度限制。以下是我最后的看法:

我尝试使用bsxfun函数,但由于我正在处理的文件太大,我的内存很快就用完了

因此,实际可行的最简单技术是:

BINVec = zeros(1,Siz_Including_All_Intvls,'uint8'); 
BINVec(vector) = 1; 
SumVec = cellfun(@(L,U) sum(BINVec(L:U)), strts, ends);
其中,STRT和ends定义单元阵列中的间隔

这段代码非常快,我在几分钟内就得到了我想要处理的所有数据集的结果!我学到的教训:有时,最被低估的解决方案是最有效的解决方案。尽管前面提到过这一点,但我只是不认为这会非常缓慢

我确实从您的回答中了解到了bsxfun的使用,我个人也很喜欢Bas的解决方案!以后我会记住这一点

就这个例子而言,我用上面的方法解决了它

非常感谢您的投入


节日快乐!

这里也回答了:你应该对开始和结束进行分区,因为它们有1-2.5亿个元素。这也将有利于性能。这将使用
chunksize*nintervals
内存。
counts = 0;
while any_chunks_left()
    counts = counts + histc(get_chunk());
end
BINVec = zeros(1,Siz_Including_All_Intvls,'uint8'); 
BINVec(vector) = 1; 
SumVec = cellfun(@(L,U) sum(BINVec(L:U)), strts, ends);