【问题标题】:Logical indexing in matlab - need help to make fastermatlab中的逻辑索引 - 需要帮助才能更快
【发布时间】:2017-08-22 21:04:47
【问题描述】:

这是我正在尝试做的,创建了一个随机数组来演示:

% 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 循环,意思是,而不是逐个元素地进行布尔索引 - 我可以为整个数组做吗一次?

【问题讨论】:

  • 顺便说一句,您的循环仅在最后保留的是jj 的最后一次迭代,即I2 = (X&gt;Xsub(160000)-del_val &amp; X&lt;Xsub(160000)+del_val)&amp; (Y&gt;Ysub(160000)-del_val &amp; Y&lt;Ysub(160000)+del_val) &amp; (Z&gt;Zsub(160000)-del_val &amp; Z&lt;Zsub(160000)+del_val);
  • 答案将取决于您的“此处未显示的进一步处理”,即您要解决的问题 Y,不一定是您选择和描述的方法 X。
  • 一次做整个阵列不是需要构建一个 35GB 的阵列吗?看起来很大。

标签: arrays matlab indexing


【解决方案1】:

这将运行 x2.5 更快,无论如何,数组太大所以每个循环仍然需要 0.3 秒,所以 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-02
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 2014-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多