algorithm - 在特定范围内查找两个大向量中元素之间的差异值并将其合并(对于 bsxfun 而言太大)

标签 algorithm matlab loops optimization subtraction

假设我们有向量 time_atime_b,其中约 600 万到 1200 万个元素(具有不同的长度)按升序排列(以皮秒为单位)

例如:

time_a=[ 72196880 112521880 118581820 122398052 142394088 144797508........6 million more....]

time_b=[81656628 151885536 169269680 424456200 652427880 760435300........12 million more....]

以最耗时的方式,我们可以遍历 time_a 中的每个元素,减去 time_b 中的每个元素,然后执行 if 语句以查看差异是否在特定的 tmax 和 tmin 内。如果是,我们将其装箱并将其添加到直方图 c 中。 c 分为 tmin:binsize:tmax ,你会看到,所以一旦我们发现我们的差异在我们的范围内,我们就在 c 中适当的 bin 中添加一个。

下面是我目前的代码。我认为有一种更聪明的方法可以做到这一点。请记住,完整的向量太大而无法使用 bsxfun(@subtract,time_a,time_b') 这将创建一个包含很多列和行的人的矩阵。有什么好主意吗?

function [c, dt, dtEdges] = coincidence4(time_a,time_b,tmin,tmax,binsize)
% round tmin, tmax to a intiger multiple of binsize:
if mod(tmin,binsize)~=0
    tmin=tmin-mod(tmin,binsize)+binsize;
end
if mod(tmax,binsize)~=0
    tmax=tmax-mod(tmax,binsize);
end

dt = tmin:binsize:tmax;
dtEdges = [dt(1)-binsize/2,dt+binsize/2];

c = zeros(1,length(dt));

Na = length(time_a);
Nb = length(time_b);

tic1=tic;

bbMin=1;
for aa = 1:Na
    ta = time_a(aa);
    bb = bbMin;

    while (bb<=Nb)
        tb = time_b(bb);
        d = tb - ta;
        if d < tmin
            bbMin = bb;
            bb = bb+1;
        elseif d > tmax
            bb = Nb+1;
        else

            index = floor((d-dtEdges(1))/(dtEdges(end)-dtEdges(1))*(length(dtEdges)-1)+1);

              c(index)=c(index)+1;
            bb = bb+1;
        end
    end

end
toc(tic1)
end

最佳答案

您可以只循环其中一个向量。我的意思是这样的:

c = zeros(size(dtEdges));
for aa = 1:Na
    d = time_b - time_a(aa);
    c = c + histc(time_b - time_a(aa), dtEdges);
end

关于algorithm - 在特定范围内查找两个大向量中元素之间的差异值并将其合并(对于 bsxfun 而言太大),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22722049/

相关文章:

algorithm - 如何聚类大型数据集

beanstalkd队列的算法

java - java中所有可能大小的所有可能排列

algorithm - 将 std::map 复制到 C++ 中的 std::set

algorithm - 用给定的概率在MATLAB中计算协方差矩阵

c++ - 进行小于比较还是小于或等于比较更有效?

matlab - 带有希腊字符和下标的箱线图标签

MATLAB - 将拟合分布曲线添加到直方图

python - 在python中的一个循环中迭代两个字典

c++ - 当特定字符被击中时,如何打破循环?