matlab中的逻辑索引 - 需要帮助才能更快

时间:2017-08-22 21:04:47

标签: arrays matlab indexing

这就是我想要做的,创建一个随机数组来演示:

% all IDs

 all_IDS = 1:216000000;    

% Array 1

X = round(1550*rand(216000000,1));
Y = round(1550*rand(216000000,1));
Z = round(90*rand(216000000,1));

% Array 2

Xsub = round(1550*rand(160000,1));
Ysub = round(1550*rand(160000,1));
Zsub = round(90*rand(160000,1));

del_val =1;

% required o/p
reqd_op = zeros(1,10); 

% boolean indexing
indx =1;
for jj = 1:160000

    VID_X = Xsub(jj);
    VID_Y = Ysub(jj);
    VID_Z = Zsub(jj);

    I2 = (X>VID_X-del_val & X<VID_X+del_val)& (Y>VID_Y-del_val & Y<VID_Y+del_val) & (Z>VID_Z-del_val & Z<VID_Z+del_val);

    len = numel(all_IDS(I2));

    reqd_op(1,indx:indx+len-1) =  all_IDS(I2);
    indx=indx+len;
end

上面的代码花了很多时间,因为我正在处理一个非常大的数组,有没有办法消除for循环,这意味着,而不是逐个元素的布尔索引 - 我可以为整个数组做马上?

1 个答案:

答案 0 :(得分:1)

这会更快地运行x2.5,无论如何,数组太大所以它仍然需要每个循环0.3s,所以160000循环就像13个小时在单个cpu上。

if ~exist('X','var')
    % Array 1
    X = round(1550*rand(216000000,1,'single'));
    Y = round(1550*rand(216000000,1,'single'));
    Z = round(90*rand(216000000,1,'single'));
    % Array 2
    Xsub = round(1550*rand(160000,1,'single'));
    Ysub = round(1550*rand(160000,1,'single'));
    Zsub = round(90*rand(160000,1,'single'));
end

del_val =single(1);
reqd_op = zeros(1,10,'single');% required o/p

tic
index =1;
for jj = 1:10
    VID_X = Xsub(jj);
    VID_Y = Ysub(jj);
    VID_Z = Zsub(jj);
    IdxFinal=[];
    Idx1=find(abs(X-VID_X)<del_val); %little better than X>VID_X-del_val & X<VID_X+del_val)
    if ~isempty(Idx1)
        Idx2 = Idx1(Y(Idx1)>VID_Y-del_val & Y(Idx1)<VID_Y+del_val);
        if ~isempty(Idx2)
            Idx3= Idx2(Z(Idx2)>VID_Z-del_val & Z(Idx2)<VID_Z+del_val);
            IdxFinal=Idx3;
        end
    end
    len = length(IdxFinal);
    index=index+len;
    if len>0
        reqd_op(1,index:index+len-1) = IdxFinal;
    end
end
toc
相关问题