2017-10-18 42 views
0

我有以下問題。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×10的顆粒組成。我想通過在particle(1,2,xp,yp)中輸入yp作爲數組來省略for循環,但不幸的是find()函數無法處理數組。或者我錯了?你有一個想法如何使它工作得更快,讓我有

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

能否請您解釋一下爲什麼你爲索引搜索'find(x <= particle(1,1,xp,yp),1,'last')'並且不應用保存的x位置的變換。例如:在你的例子中,'x'的取值範圍爲-10到10,步長爲1,你可以使用保存值的​​floor並抵消它以獲得索引?這樣你會省略一個循環。你只需要知道你需要執行的保存的'x'或'y'座標上的哪個變換來獲得索引 – Irreducible

+0

在我的原始代碼中,我有'x = linspace(-0.0800,0.0134,nx)',我的步驟是取決於'dx =(0.08 + 0.0134)/(nx-1);''nx = 100'。所以我沒有看到使用地板。但我也可能是錯的。 –

+0

'linspace'產生線性間隔的x值,所以你只需要知道你的數組的步長和最小值,看到我的答案結束。 – Irreducible

回答

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 

我知道它是適用於矢量,而不是一個矩陣然而,您可以將此轉換應用於Matrix的任何維度。

您是不是在1步改變x的情況,但這樣的事情:

x=min_x:dx:max_x 

那麼你需要做到以下幾點:

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

這看起來非常棒。謝謝。我現在必須測試它。 –