簡體   English   中英

Matlab中的邏輯索引-需要幫助以加快速度

[英]Logical indexing in matlab - need help to make faster

這就是我想要做的,創建了一個隨機數組來演示:

% 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循環,這意味着可以代替逐個元素地進行布爾索引-我可以一次對整個數組進行處理嗎?

無論如何,這將運行x2.5更快,因為數組太大,因此每個循環仍需要0.3s,因此160000個循環在單個cpu上就像13個小時。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM