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

for schleife vermeiden

 

asxoniles
Forum-Anfänger

Forum-Anfänger


Beiträge: 42
Anmeldedatum: 05.08.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.03.2011, 17:42     Titel: for schleife vermeiden
  Antworten mit Zitat      
Hi,
habe folgenden code
Code:

for i=1:numel(descriptor)
for c=1:desc_size
            distance(:,c)=sum(bsxfun(@minus,codebook,descriptors{1,i}(c,:)).^2,2);
        end
end
 


das codebook ist eine 2000x128 und descriptor ein cellarray mit zb jeweils einer 34x128 matrix. innerhalb der for schleife zieht allen zeilen von codebook jeweils eine Zeile von Descriptor ab und ermittelt die summe.

kann man die inner for schleife irgendwie verhindern? ist die äußere schleife auch vermeidbar?
beide in kombination sind leider sehr rechenintensiv Sad

vielen dank im voraus
Private Nachricht senden Benutzer-Profile anzeigen


denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 08.03.2011, 19:18     Titel:
  Antworten mit Zitat      
Hallo

den Code wie es hier steht, versteh ich nicht.
Und so würde ich sagen dass es nicht reduzierbar ist.

Aber ich glaube du machst hier einen Denkfehler. Ich sehe dass in Innerer Schleife distance bei nächstem discriptor überschrieben wird
Vielleicht ist BSXFUN hier nicht notwendig.

Bitte genau beschreiben was es macht, anhand eines kleines Beispiels.
Private Nachricht senden Benutzer-Profile anzeigen
 
asxoniles
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 42
Anmeldedatum: 05.08.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.03.2011, 22:44     Titel:
  Antworten mit Zitat      
Hi Denny

also ich habe ein Cellarray Descriptor, das in jeder Zelle eine N x n Matrix M enthält. Das Cellarray ist zb 1x326 groß. Dann habe ich zusätzlich ein Array Codebook C, das c x n groß ist (mit c>>N).

Die Aufgabe ist es, für jede Matrix in dem Cellarray die zeilenweise Differenz zu bilden. also ich nehme von M die erste Zeile und subtrahiere diese vom Codebook. anschließend errechne ich die Vektornorm der Zeilen (quadrieren, Summe in x-Richtung und Wurzel ziehen (den Schritt hatte ich dem Beispiel nicht dabei, da ich das die Wurzel auf distance später bequem außerhalb der for Schleife berechnen konnte. im Anschluß errechne ich noch ein Histogram aus der Distanz (hatte ich aber nicht im code drin)

also der original code war folgender:
Code:

code_size=size(codebook,1);
for i=1:numel(descriptor)
 desc_size=size(descriptor{1,i},1);
 for c=1:desc_size
  for p=1:code_size
   distance(p,c)=norm(codebook(p,:)-descriptor{1,i}(c,:));
  end
 end
 
 ...
end


die innerste for Schleife habe ich dann durch ersetzen von norm() mit sqrt(sum((A-B).^2)) aufgelöst. da ich nur die summe des Vektors in X-Richtung brauche sum(...,2)

Code:

code_size=size(codebook,1);
for i=1:numel(descriptor)
 desc_size=size(descriptor{1,i},1);
 for c=1:desc_size
   distance(:,c)=sum(bsxfun(@minus,codebook,descriptor{1,i}(c,:)).^2,2);
 end
 distance=sqrt(distance);
 ...
end


hoffe ich hab nicht noch mehr verwirrt Rolling Eyes
also nochmal kurz zusammengefasst: von einer matrix die zeilen einer anderen matrix abziehen und einen wert aus der entstehenden zeile berechnen.

danke für deine Hilfe
andreas
Private Nachricht senden Benutzer-Profile anzeigen
 
Peter Quint
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 95
Anmeldedatum: 21.02.11
Wohnort: Lübeck
Version: R2010b
     Beitrag Verfasst am: 09.03.2011, 11:49     Titel: Re: for schleife vermeiden
  Antworten mit Zitat      
asxoniles hat Folgendes geschrieben:
Hi,
habe folgenden code
Code:

for i=1:numel(descriptor)
for c=1:desc_size
            distance(:,c)=sum(bsxfun(@minus,codebook,descriptors{1,i}(c,:)).^2,2);
        end
end
 




Ganz schnell ohne zu testen... vielleicht funktioniert es ja Wink
Code:

distance(:,1:numel(descriptor),1:desc_size)=sum(bsxfun(@minus,codebook,descriptors{1,1:numel(descriptor)}(1:desc_size,:)).^2,2);
 
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 09.03.2011, 14:33     Titel:
  Antworten mit Zitat      
Hallo

@ Peter Quint
Guter Versuch, aber so einfach ist es mit Cells nicht.
Bei Kombination von Indizien in Cell Array muss erste Klammerpaar fest sein, sonst kommt Fehlermeldung: "??? Bad cell reference operation."


@ asxoniles
Sind denn in descriptor gleich große Matrizen abgelegt ?
Wenn nicht, dann kann man äußere Loop nicht vermeiden.

so kann man Innere- FOR-Loop vermeiden:
Code:

codebook    = round(rand(2000,128)*10000);
descriptor  = arrayfun(@(x,y){round(rand(x,y)*100)},[34 34],[128 128]);
code_size   = size(codebook,1);

for i = 1:numel(descriptor)
   desc_size     = size(descriptor{1,i});
   tmpdescriptor = reshape(descriptor{1,i}', 1, desc_size(2), desc_size(1));
   distance      = squeeze(sum(bsxfun(@minus, codebook, tmpdescriptor).^2, 2));
   distance      = sqrt(distance);
end

 
Private Nachricht senden Benutzer-Profile anzeigen
 
asxoniles
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 42
Anmeldedatum: 05.08.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.03.2011, 12:09     Titel:
  Antworten mit Zitat      
Hi Denny

danke für die tolle Lösung.

Funktioniert perfekt.

A
Private Nachricht senden Benutzer-Profile anzeigen
 
asxoniles
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 42
Anmeldedatum: 05.08.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.03.2011, 14:25     Titel:
  Antworten mit Zitat      
Falls jemand ähnlich paarweise Abstände berechnen will bei mathwork central gibt es diese Lösung, die mir meine for-Schleife abnimmt:

http://www.mathworks.com/matlabcent.....nge/24599-distance-matrix

funktioniert 1A, die Werte sind fast identistisch und ist super schnell. Man muss nur mal schauen ob die Dimensionen passen.
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.