www.vorhilfe.de
- Förderverein -
Der Förderverein.

Gemeinnütziger Verein zur Finanzierung des Projekts Vorhilfe.de.
Hallo Gast!einloggen | registrieren ]
Startseite · Mitglieder · Impressum
Forenbaum
^ Forenbaum
Status VH e.V.
  Status Vereinsforum

Gezeigt werden alle Foren bis zur Tiefe 2

Navigation
 Startseite...
 Suchen
 Impressum
Das Projekt
Server und Internetanbindung werden durch Spenden finanziert.
Organisiert wird das Projekt von unserem Koordinatorenteam.
Hunderte Mitglieder helfen ehrenamtlich in unseren moderierten Foren.
Anbieter der Seite ist der gemeinnützige Verein "Vorhilfe.de e.V.".
Partnerseiten
Weitere Fächer:

Open Source FunktionenplotterFunkyPlot: Kostenloser und quelloffener Funktionenplotter für Linux und andere Betriebssysteme
Forum "Matlab" - Abstand Vektor/Matrix
Abstand Vektor/Matrix < Matlab < Mathe-Software < Mathe < Vorhilfe
Ansicht: [ geschachtelt ] | ^ Forum "Matlab"  | ^^ Alle Foren  | ^ Forenbaum  | Materialien

Abstand Vektor/Matrix: Frage (beantwortet)
Status: (Frage) beantwortet Status 
Datum: 11:52 Fr 25.04.2008
Autor: mp666

Ich habe diese Frage in keinem Forum auf anderen Internetseiten gestellt.

Hallo,
ich habe folgendes Problem. Ich habe hier 2 Matrizen der Dimension (grob geschätzt:) 90000x3  und nun möchte ich den kürzesten Abstand der einzelnen Punkte der einen Matrix zu den Punkten der anderen Matrix.

Mein Code sieht im Moment folgendermaßen aus :

[m,n] = size(matrix1);
[o,p] = size(matrix2);


for i=(1:m)
        for k=(1:o)
            count(k,:) = norm(matrix2(k,:) - matrix1(i,:));
        end
        ausgabe(i,1) = min(count);
end

Das Problem hierbei ist, es dauert unendlich lange. Die beiden Matrizen entsprechen 2 Ebenen, welche nicht sooo weit auseinander liegen und somit ist es quatsch, dass auch die beiden entferntesten Punkte miteinander berechnet werden.
Kann man den Code irgendwie optimieren, so dass unnötige Berrechnungen gar nicht erst durchgeführt werden?

MFG
MP

        
Bezug
Abstand Vektor/Matrix: Antwort
Status: (Antwort) fertig Status 
Datum: 22:38 So 27.04.2008
Autor: Martin243

Hallo,

du kannst auf jeden Fall die innere for-Schleife beseitigen, indem du den Vektor aus der äußeren Schleife per repmat auf dieselbe Größe wie matrix2 bringst und so alle Entfernungen zwischen dem einen Vektor und allen Vektoren aus matrix2 auf einen Schlag berechnest.
Außerdem solltest du alle Matrizen, die du Element für Element füllst, mit der richtigen Größe vorinitialisieren, da das Anpassen der Größe zur Laufzeit relative lange dauert und eine richtige Leistungsbremse ist.
Außerdem musst du nicht direkt das Minimum des euklidischen Abstands berechnen. Es reicht schon, wenn du die Summe der Differenzenquadrate berechnest und minimierst. Dann musst du nur noch aus diesem einen Wert die Wurzel ziehen (also nicht norm benutzen).
Mit diesem Ansatz bin ich schon auf immerhin ca. 20 Minuten gekommen (bei gleichverteilten Zufallsdaten, je 90000 Vektoren pro Matrix).

Wenn du nun aber auf unter eine Minute kommen willst, dann empfehle ich folgendes:
Unterteile den Raum, in dem die Daten von matrix2 liegen, durch ein 3D-Gitter (also min/max-x/y/z bestimmen und dazwischen Grenzen ziehen). Bei jedem Vektor aus matrix1 bestimmst du anhand dieser Grenzen, in welchem der kleinen Würfel im Gitter der Punkt liegt und berechnest nur noch die Abstände zu den matrix2-Vektoren in diesem Würfel und den angrenzenden Würfeln.
Ich habe für gleichverteilte Zufallsdaten den gesamten "Datenwürfel" in 15 Teile in x-, y- und z-Richtung unterteilt und konnte die Minimalabstände in einer knappen Minute berechnen. Also recht schnell für die große Datenmenge, denke ich.


Gruß
Martin

Bezug
                
Bezug
Abstand Vektor/Matrix: Frage (reagiert)
Status: (Frage) reagiert/warte auf Reaktion Status 
Datum: 10:20 Mo 28.04.2008
Autor: mp666

Aufgabe
Wenn du nun aber auf unter eine Minute kommen willst, dann empfehle ich folgendes:
Unterteile den Raum, in dem die Daten von matrix2 liegen, durch ein 3D-Gitter (also min/max-x/y/z bestimmen und dazwischen Grenzen ziehen). Bei jedem Vektor aus matrix1 bestimmst du anhand dieser Grenzen, in welchem der kleinen Würfel im Gitter der Punkt liegt und berechnest nur noch die Abstände zu den matrix2-Vektoren in diesem Würfel und den angrenzenden Würfeln.
Ich habe für gleichverteilte Zufallsdaten den gesamten "Datenwürfel" in 15 Teile in x-, y- und z-Richtung unterteilt und konnte die Minimalabstände in einer knappen Minute berechnen. Also recht schnell für die große Datenmenge, denke ich.


Hi,
Danke für die Antwort. Also das Vorinitialisieren mit Nullen der Ausgabematrix ist vorher schon geschehen.
Das Prinzip mit den Differenzquadraten, lautet die Formel dann so:                

count(k) = sqrt( [mm] (matrix2(k,1)-matrix1(i,1))^2 [/mm] + [mm] (matrix2(k,2)-matrix1(i,2))^2 [/mm] + [mm] (matrix2(k,3)-matrix1(i,3))^2 [/mm] );
ausgabe(i) = min(count(k));


Die Idee mit Matrix2 ind kleine "Würfel" zu unterteilen ist im Prinzip genau die Lösung, nach der ich gesucht habe, leider weiß ich echt nicht, wie das als Code aussieht :-) Wäre also für ein Codefragment, welches ich da einbauen kann sehr sehr dankbar.

Und wie genau funktioniert der Befehl repmap bzw. was genau macht der, das konnte ich aus der Hilfe nicht genau herauslesen.
MFG
MP

Bezug
                        
Bezug
Abstand Vektor/Matrix: Antwort
Status: (Antwort) fertig Status 
Datum: 09:59 Fr 02.05.2008
Autor: Martin243

Hallo,

wirf mal einen Blick auf [a]meine Funktion. Du kannst sie erstmal mit kleinen Punktmatrizen testen, um zu sehen, ob diese nicht evtl. noch transponiert werden müssen, um mit meiner Funktion verarbeitet werden zu können.

Gruß
Martin

Dateianhänge:
Anhang Nr. 1 (Typ: m) [nicht öffentlich]
Bezug
Ansicht: [ geschachtelt ] | ^ Forum "Matlab"  | ^^ Alle Foren  | ^ Forenbaum  | Materialien


^ Seitenanfang ^
ev.vorhilfe.de
[ Startseite | Mitglieder | Impressum ]