www.matheraum.de
Das Matheforum.
Das Matheforum des MatheRaum.

Für Schüler, Studenten, Lehrer, Mathematik-Interessierte.
Hallo Gast!einloggen | registrieren ]
Startseite · Forum · Wissen · Kurse · Mitglieder · Team · Impressum
Forenbaum
^ Forenbaum
Status Mathe
  Status Schulmathe
    Status Primarstufe
    Status Mathe Klassen 5-7
    Status Mathe Klassen 8-10
    Status Oberstufenmathe
    Status Mathe-Wettbewerbe
    Status Sonstiges
  Status Hochschulmathe
    Status Uni-Analysis
    Status Uni-Lin. Algebra
    Status Algebra+Zahlentheo.
    Status Diskrete Mathematik
    Status Fachdidaktik
    Status Finanz+Versicherung
    Status Logik+Mengenlehre
    Status Numerik
    Status Uni-Stochastik
    Status Topologie+Geometrie
    Status Uni-Sonstiges
  Status Mathe-Vorkurse
    Status Organisatorisches
    Status Schule
    Status Universität
  Status Mathe-Software
    Status Derive
    Status DynaGeo
    Status FunkyPlot
    Status GeoGebra
    Status LaTeX
    Status Maple
    Status MathCad
    Status Mathematica
    Status Matlab
    Status Maxima
    Status MuPad
    Status Taschenrechner

Gezeigt werden alle Foren bis zur Tiefe 2

Navigation
 Startseite...
 Neuerdings beta neu
 Forum...
 vorwissen...
 vorkurse...
 Werkzeuge...
 Nachhilfevermittlung beta...
 Online-Spiele beta
 Suchen
 Verein...
 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
Mathe-Seiten:Weitere Fächer:

Open Source FunktionenplotterFunkyPlot: Kostenloser und quelloffener Funktionenplotter für Linux und andere Betriebssysteme
StartseiteMatheForenMatlabAbstand Vektor/Matrix
Foren für weitere Schulfächer findest Du auf www.vorhilfe.de z.B. Geschichte • Erdkunde • Sozialwissenschaften • Politik/Wirtschaft
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 ^
www.matheforum.net
[ Startseite | Forum | Wissen | Kurse | Mitglieder | Team | Impressum ]