www.vorhilfe.de
Vorhilfe

Kostenlose Kommunikationsplattform für gegenseitige Hilfestellungen.
Hallo Gast!einloggen | registrieren ]
Startseite · Forum · Wissen · Kurse · Mitglieder · Team · Impressum
Forenbaum
^ Forenbaum
Status Vorhilfe
  Status Geisteswiss.
    Status Erdkunde
    Status Geschichte
    Status Jura
    Status Musik/Kunst
    Status Pädagogik
    Status Philosophie
    Status Politik/Wirtschaft
    Status Psychologie
    Status Religion
    Status Sozialwissenschaften
  Status Informatik
    Status Schule
    Status Hochschule
    Status Info-Training
    Status Wettbewerbe
    Status Praxis
    Status Internes IR
  Status Ingenieurwiss.
    Status Bauingenieurwesen
    Status Elektrotechnik
    Status Maschinenbau
    Status Materialwissenschaft
    Status Regelungstechnik
    Status Signaltheorie
    Status Sonstiges
    Status Technik
  Status Mathe
    Status Schulmathe
    Status Hochschulmathe
    Status Mathe-Vorkurse
    Status Mathe-Software
  Status Naturwiss.
    Status Astronomie
    Status Biologie
    Status Chemie
    Status Geowissenschaften
    Status Medizin
    Status Physik
    Status Sport
  Status Sonstiges / Diverses
  Status Sprachen
    Status Deutsch
    Status Englisch
    Status Französisch
    Status Griechisch
    Status Latein
    Status Russisch
    Status Spanisch
    Status Vorkurse
    Status Sonstiges (Sprachen)
  Status Neuerdings
  Status Internes VH
    Status Café VH
    Status Verbesserungen
    Status Benutzerbetreuung
    Status Plenum
    Status Datenbank-Forum
    Status Test-Forum
    Status Fragwürdige Inhalte
    Status VH e.V.

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
Dt. Schulen im Ausland: Mathe-Seiten:

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 ^
www.vorhilfe.de