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

Schnittmenge leer?

 

mlafunk
Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 26.05.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.12.2011, 14:36     Titel: Schnittmenge leer?
  Antworten mit Zitat      
Hallo, liebe Matlab-Gemeinde !!

ich stehe vor einem kleinen Problem, was für einige von euch wahrscheinlich relativ trivial ist...

Es geht um Folgendes, ich möchte prüfen, ob die Schnittmenge des Inneren (also ohne Rand) zweier Boxen (im R^2) leer oder nicht leer ist und eine entsprechende Funktion schreiben.

Für den Fall, dass der Schnitt nicht leer ist, sollte die Funktion die Schnitt-Box ausgeben (allerdings mit Rand).

1-D Beispiel : box1=[1,2], box2=[2,3] -> Schnittmenge des Inneren ist leer (da 2 auf den Rand beider Boxen liegt) box1=[1,3], box2=[2,4] -> Scnittmenge des Inneren ist nicht leer. Schnittbox ist [2,3] (mit Rand)

Ich habe schon mit dem Befehl intersect experimentiert und versucht das Ganze mit einer if Schleife zu lösen, bisher aber ohne Erfolg, deshalb hoffe ich nun auf professionelle HILFE!!!

Danke schonmal im Voraus =)

Grüße mlafunk
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 17.12.2011, 21:42     Titel: Re: Schnittmenge leer?
  Antworten mit Zitat      
Hallo mlafunk,

Zwei 3D-Boxen überschneiden sich, wenn sie sich in allen drei Dimensionen überschneiden. Also wäre die Lösung für den 1D-Fall schon sehr hilfreich.

Es gibt weder in Matlab noch in anderen mir bekannten Programmiersprachen eine "IF-Schleife".
INTERSECT testet, ob sich in zwei Vektoren gleiche Elemente befinden. Das ist für Deine Fragestellung also ungeeignet.
RECTINT berechnet die Fläche der Überschneidung bei 2D-Rechtecken, also auch nicht gut geeignet.

Aber die Überlappung bei box1=[a1,b1] und box2=[a2,b2] festzustellen ist nicht schwierig. Versuche es nochmal und poste den Code, wenn Du Verbesserungsvorschläge benötigst.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
mlafunk
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 26.05.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.12.2011, 16:22     Titel:
  Antworten mit Zitat      
Hallo Jan,

du hast natürlich recht, es gibt keine IF-Schleife Embarassed
ich meinte ein IF-Statement Wink

deine Tipps waren erstmal sehr hilfreich für mich Idea , ich hatte mich zu sehr auf INTERSECT fixiert und bin deshalb nicht recht weiter gekommen...

Soweit habe ich jetzt erstmal einen neuen Code geschrieben, der mir sagt, ob eine Schnittmenge vorhanden ist. (hoffe ich zumindest)

Mir fehlt jetzt nurnoch der letzte Punkt, ich möchte, dass für denn Fall, dass der Schnitt nicht leer ist, die Funktion die Schnitt-Box ausgibt (incl. Rand).

(für unbekannte Variablen sei gesagt, der Code ist nur ein Teilausschnitt)

hier ist erstmal mein Code:
(Teil1)
Code:

function [D1,D2]=checkIfIntersectionOfTwoBoxesIsEmpty(box1,box2,n)
 D1=zeros(1,1,n); % D1 und D2 sind jeweils Boxen in denen an dritter Stelle n als eine Art Nummerierung durchläuft, das gilt für jedes n das auftaucht
  D2=zeros(1,1,n);
  for i=1:n;
   D1(:,:,n)=box2(1,1,n)-box1(1,2,n);
   D2(:,:,n)=box2(2,1,n)-box1(2,2,n);
  end
end
 


zusätzliche Bedingung und der Code:
(Teil2)

Code:

[D1,D2]=checkIfIntersectionOfTwoBoxesIsEmpty(box1,box2,n);

isEmpty=zeros(1,n);

for f=1:n

if D1(:,:,n)&&D2(:,:,n)<=0
  isEmpty(:,n) = 1; % true
else
  isEmpty(:,n) = 0; % false
end

end
 


Naja, soweit ganz annehmbar, doch ich weiß einfach nicht, wie ich es hinkriegen kann, dass jetzt anhand von "isEmpty" = 1 oder 0 die jeweiligen Stellen meiner neuen Box generiert werden können.
müsste ja dann eigentlich an den jeweiligen Stellen "isEmpty" = 0 sein.
Code:

box3=zeros(2,2,n);
for j=1:n
 for f= isEmpty=0 % soweit der gedachte Vorgang, aber ist natürlich Mist, so wies jetzt ist Sad
box3(:,:,j)=[min(box1(:,:,f)),max(box2(:,:,f))]
 end
end
 


Soll quasi bedeuten, an den Stellen, wo isEmpty gleich Null ist, soll einen neue Box generiert werden.

Ich hoffe, dass ich mein Problem einigermaßen anschaulich beschrieben konnte, hoffe auf erneute gute Hilfe und bedanke mich mit gutem Gewissen schonmal im Voraus =)

Grüße mlafunk

p.s.: da es sich um einen Auszug meines gesamten Codes handelt, habe ich evtl. vergessen einige Passagen ausreichend zu beschrieben, wenn noch was unklar ist, würde ich das gerne noch versuchen besser zu erklären Smile
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 - 2025 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.