matlab find()粒子的细胞指数,4-D double

时间:2017-10-18 07:51:07

标签: matlab

我有以下问题。

考虑到我在一个区域中有4个粒子。 粒子以一定的速度穿过该区域。但是,在任何给定的时间点,我想知道这样一个粒子所在的单元格。

我的示例代码如下所示:

x = -10:1:10; % area
y = -10:1:10;

particle = zeros(1,2,1,4); % 4 Particle 
particle(1,1,1,1) = 9.5;  % x-position of the first particle
particle(1,2,1,1) = 9.5; %  y-position of the first particle
particle(1,1,1,2) = 7.25;  
particle(1,2,1,2) = 8.5; 
particle(1,1,1,3) = 6.25;  
particle(1,2,1,3) = 7.5;
particle(1,1,1,4) = 5.25;  
particle(1,2,1,4) = 6.5;

for xp=1:size(particle,3)
    for yp=1:size(particle,4)
        if particle(1,1,xp,yp) < x(1) 
            cell_x = 1;
        elseif particle(1,1,xp,yp) > x(end) 
            cell_x = size(x,2);
        else 
            cell_x = find(x <= particle(1,1,xp,yp),1,'last');
        end
        if particle(1,2,xp,yp) < y(1) 
            cell_y = 1;
        elseif particle(1,2,xp,yp) > y(end)
            cell_y = size(y,2);
        else
            cell_y = find(y <= particle(1,2,xp,yp),1,'last'); 
        end
    end
end

对于许多52 x 10粒子,我的代码需要太长时间。我希望在yp中输入particle(1,2,xp,yp)作为数组来省略for循环,但不幸的是find()函数无法处理数组。还是我错了?你知道如何让它更快地工作,以便我有

cell_x = [20,18,17,16]
cell_y = [20,19,18,17]

1 个答案:

答案 0 :(得分:0)

我的评论的示例代码

x = -10:1:10; % area x

%input data 
Numberofdata=4;
saved_x=[9.5 7.25 6.25 5.25];

%conversion from value to index
idx_x1=floor(saved_x)+abs(min(x))+1;
%search for index
for k=1:Numberofdata
idx_x2(k,1)=find(x <=saved_x(k),1,'last');
end

%    Output
[idx_x1' idx_x2]

20    20
18    18
17    17
16    16

我知道它适用于矢量而不是矩阵,但是,您可以将此变换应用于矩阵的任何维度。

如果您没有按1的步骤更改x,而是类似的事情:

x=min_x:dx:max_x

然后您需要执行以下操作:

idx_x1=floor(saved_x/dx)+abs(min_x/dx)+1;