मुझे निम्न समस्या है।

यह देखते हुए कि मेरे पास एक क्षेत्र में 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 कणों की संख्या के लिए बहुत अधिक समय लेता है। मैं particle(1,2,xp,yp) में एक सरणी के रूप में yp दर्ज करके लूप के लिए छोड़ना चाहता था, लेकिन दुर्भाग्य से find() फ़ंक्शन सरणियों को संभाल नहीं सकता। या मैं गलत हूँ? क्या आपके पास कोई विचार है कि इसे और अधिक तेज़ी से कैसे काम करना है ताकि मेरे पास हो

cell_x = [20,18,17,16]
cell_y = [20,19,18,17]
0
Dimitri Harder 18 अक्टूबर 2017, 10:51
क्या आप कृपया बता सकते हैं कि आप सूचकांक के लिए find(x <= particle(1,1,xp,yp),1,'last') क्यों खोज रहे हैं और सहेजे गए x-स्थिति के परिवर्तन को लागू नहीं कर रहे हैं। उदाहरण: आपके उदाहरण में x 1 के चरणों में -10 और 10 के बीच मान लेता है, आप केवल सहेजे गए मान के फर्श का उपयोग कर सकते हैं और इसे इंडेक्स प्राप्त करने के लिए ऑफ़सेट कर सकते हैं? इस तरह आप एक लूप छोड़ देंगे। आपको बस यह जानने की जरूरत है कि सहेजे गए x या y निर्देशांक पर कौन सा परिवर्तन सूचकांक प्राप्त करने के लिए आपको प्रदर्शन करने की आवश्यकता है
 – 
Irreducible
18 अक्टूबर 2017, 11:02
मेरे मूल कोड में मेरे पास x=linspace(-0.0800,0.0134,nx) है और मेरा कदम dx = (0.08+0.0134) / (nx-1); के साथ nx=100 पर निर्भर है। इसलिए मुझे फर्श का उपयोग नहीं दिख रहा है। लेकिन मैं गलत भी हो सकता हूं।
 – 
Dimitri Harder
18 अक्टूबर 2017, 11:29
linspace रैखिक रूप से दूरी वाले x मान उत्पन्न करता है, इसलिए आपको केवल चरण आकार और अपनी न्यूनतम सरणी जानने की आवश्यकता है, मेरे उत्तर का अंत देखें।
 – 
Irreducible
18 अक्टूबर 2017, 11:32

1 उत्तर

सबसे बढ़िया उत्तर

मेरी टिप्पणी के लिए एक उदाहरण कोड

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;
0
Irreducible 18 अक्टूबर 2017, 11:40
यह वास्तव में बहुत अच्छा लग रहा है। शुक्रिया। मुझे अभी इसका परीक्षण करना है।
 – 
Dimitri Harder
18 अक्टूबर 2017, 11:36