WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Zellen in Abhängigkeit zweier Funktionen löschen

 

dustin.kottonau
Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 11.08.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.04.2014, 23:18     Titel: Zellen in Abhängigkeit zweier Funktionen löschen
  Antworten mit Zitat      
Sehr geehrte Forums-Mitglieder,

ich habe folgenden Code geschrieben:

Code:

clear all
close all
clc

radius = 2;                                                                 % Circle Radius [mm]
k = 20;                                                                     % Resolution []
frame = 2*radius;                                                           % Frame [mm]


%% Creating Point Matrix with a Size of k*k================================

for m = 1:k
    for n = 1:k
        h{m,n} = [n/(k/frame),m/(k/frame)];
    end
end

%% Creating Circle Boundary Function=======================================

angle = 1/(k/frame):1/(k/frame):k/(k/frame);
y_up = sqrt(radius.^2-(angle-radius).^2)+radius;
y_down = -sqrt(radius.^2-(angle-radius).^2)+radius;

plot(angle,y_up,angle,y_down)
hold on

%% Deleting all Points outside of the Circle Boundary Function=============

for m = 1:k
    for n = 1:k
        if h{m,n}(2) >= real(y_up(n))-1e-8                                  % 1e-8 ist zu Verhinderung von Rundungsfehlern
            h{m,n}=[];
        end
       
        emptyCells = cellfun('isempty', h);
       
        if emptyCells(m,n)==0
            if h{m,n}(2) <= real(y_down(n))+1e-8                            % 1e-8 ist zu Verhinderung von Rundungsfehlern
                h{m,n}=[];
            end
        end
    end
end

%% Plotting all Points inside of the Circle Boundary Function==============

for m = 1:k
    for n = 1:k
        if emptyCells(m,n) == 0
            plot(h{m,n}(1),h{m,n}(2),'rx')
            hold on
        end
    end
end
hold off
 


Das Ergebnis sollte ähnlich der Abbildung "punkte.png" sein.

Dieser Code erzeugt zwischen zwei Funktionen y_up und y_down beliebig viele Punkte. Die Anzahl der Punkt zwischen den Funktionen wird von der Auflösung k bestimmt. Die Funktionen bilden einen Kreis nach. Meine Frage bezieht sich auf den mittleren Codeabschnitt:

Code:


for m = 1:k
    for n = 1:k
        if h{m,n}(2) >= real(y_up(n))-1e-8                                  % 1e-8 ist zu Verhinderung von Rundungsfehlern
            h{m,n}=[];
        end
       
        emptyCells = cellfun('isempty', h);
       
        if emptyCells(m,n)==0
            if h{m,n}(2) <= real(y_down(n))+1e-8                            % 1e-8 ist zu Verhinderung von Rundungsfehlern
                h{m,n}=[];
            end
        end
    end
end
 


In diesem Codeabschnitt werden alle Punkte überhalb von y_up und alle Punkte unterhalb von y_down gelöscht ( [] nicht [0,0] ). Ab einer gewissen Auflösung (k > 200) nimmt die Berechnungzeit sehr stark zu. Schuld sind die verschlachtelten Schleifen.

Meine Frage nun:
Wie kann man die Zellen in Abhängigkeit der beiden Funktionen y_up und y_down löschen ( [] nicht [0,0] ) ohne Schleifen zu verwenden?

Über eure Hilfe wäre ich sehr dankbar !!!

Vielen Dank und viele Grüße
Dustin

punkte.png
 Beschreibung:

Download
 Dateiname:  punkte.png
 Dateigröße:  7.15 KB
 Heruntergeladen:  680 mal
Private Nachricht senden Benutzer-Profile anzeigen


Mmmartina
Forum-Meister

Forum-Meister


Beiträge: 745
Anmeldedatum: 30.10.12
Wohnort: hier
Version: R2020a
     Beitrag Verfasst am: 24.04.2014, 08:36     Titel: Re: Zellen in Abhängigkeit zweier Funktionen löschen
  Antworten mit Zitat      
dustin.kottonau hat Folgendes geschrieben:

In diesem Codeabschnitt werden alle Punkte überhalb von y_up und alle Punkte unterhalb von y_down gelöscht ( [] nicht [0,0] ). Ab einer gewissen Auflösung (k > 200) nimmt die Berechnungzeit sehr stark zu. Schuld sind die verschlachtelten Schleifen.

Meine Frage nun:
Wie kann man die Zellen in Abhängigkeit der beiden Funktionen y_up und y_down löschen ( [] nicht [0,0] ) ohne Schleifen zu verwenden?


Wie liegen denn die Werte in h{m,n}(2) und in y_up und y_down vor? Sind sie dort sortiert spaltenweise sortiert? Wenn ja, würde es reichen, den Wert zu finden, ab welchem die Grenzwerte über- bzw. unterschritten werden?

Alternativ würde ich die Erstellung der ersten Punktmatrix anders machen.
Du kennst die obere und untere Grenzefunktion. Diese entsprechend der Auflösung k abtasten. Somit erhält man zwei gleich lange Vektoren.
Zwischen den Vektoren musst du dann nur entsprechend Spalte für Spalte im Zeilenabstand k die Wertepaare Speichern.
(Oder alternativ gleich mit einer 0-1 Matrix arbeiten, die du nur mit der Auflösung k multiplizierst, wenn es geplottet werden soll.)
_________________

LG
Martina

"Wenn wir bedenken, daß wir alle verrückt sind, ist das Leben erklärt." (Mark Twain))
Private Nachricht senden Benutzer-Profile anzeigen
 
dustin.kottonau
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 11.08.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.04.2014, 07:22     Titel:
  Antworten mit Zitat      
Hallo Martina,

danke für die schnelle Rückmeldung!

Die Variable h ist ein CellArray mit der Dimension m*n bzw. k*k (quadratisch). Jeder Zelle enthält einen Koordinatenpunkt [x_k , y_k]. Der Befehl h{m,n}(2) spricht also die y-Koordinate eines Punktes an. Die Funktionen y_up und y_down geben die obere und die untere Grenzfunktion wieder. Beide Funktionen sind eindimensionale Matrizen der der Form 1*m.
Diese Matrix sieht wie folgt aus (Die Kommas sind natürlich Punkt in MATLAB):

[3,2 3,6 3,83 3,95 4 3,95 3,83 3,6 3,2 2]

Die Grenzfunktion löscht alle y-Koordinaten in der h-Matrix, welche größer sind als der ansprechende y-Wert der y_up-Matrix.

Das angepasste CellArray h sieht wie folgt aus (beide Grenzfunktionen berücksichtigt):

[] [] [1,2 0,4] [1,6 0,4] [2 0,4] [2,4 0,4] [2,8 0,4] [] [] []
[] [0,8 0,8] [1,2 0,8] [1,6 0,8] [2 0,8] [2,4 0,8] [2,8 0,8] [3,2 0,8] [] []
[0,4 1,2] [0,8 1,2] [1,2 1,2] [1,6 1,2] [2 1,2] [2,4 1,2] [2,8 1,2] [3,2 1,2] [3,6 1,2] []
[0,4 1,6] [0,8 1,6] [1,2 1,6] [1,6 1,6] [2 1,6] [2,4 1,6] [2,8 1,6] [3,2 1,6] [3,6 1,6] []
[0,4 2] [0,8 2] [1,2 2] [1,6 2] [2 2] [2,4 2] [2,8 2] [3,2 2] [3,6 2] []
[0,4 2,4] [0,8 2,4] [1,2 2,4] [1,6 2,4] [2 2,4] [2,4 2,4] [2,8 2,4] [3,2 2,4] [3,6 2,4] []
[0,4 2,8] [0,8 2,8] [1,2 2,8] [1,6 2,8] [2 2,8] [2,4 2,8] [2,8 2,8] [3,2 2,8] [3,6 2,8] []
[] [0,8 3,2] [1,2 3,2] [1,6 3,2] [2 3,2] [2,4 3,2] [2,8 3,2] [3,2 3,2] [] []
[] [] [1,2 3,6] [1,6 3,6] [2 3,6] [2,4 3,6] [2,8 3,6] [] [] []
[] [] [] [] [] [] [] [] [] []

Es ist zu erkennnen, dass es sich um Punkte in einem Kreis handelt. Diese Punkt benutzte ich später um die Distanz zwischen jeden Punkt zu bestimmen.

Vielen Dank und viele Grüße
Dustin
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.