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 bei Permutation umgehen

 

breat
Forum-Anfänger

Forum-Anfänger


Beiträge: 33
Anmeldedatum: 27.09.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.01.2012, 11:03     Titel: for-Schleife bei Permutation umgehen
  Antworten mit Zitat      
Hallo an alle,

hier habe ich ein Problem für Tüftler (glaube ich zumindest). Ich habe eine 3-dimensionale Matrix A, aus der ich 10000 mal ziehe mit Zurücklegen. Dabei soll die Struktur in der dritten Dimension, erhalten bleiben. Der Befehl

Code:

for i = 1 : 10000
   B(:,:,i) = A(ceil(n*rand(n,1)),:,i);
end
 


liefert mir genau das, was ich meine (wobei n die Größe der ersten Dimension ist). Nun meine Frage: Ist es irgendwie möglich, diese Vorschleife zu umgehen, da sie mir zu viel Zeit kostet? Ich dachte an so was wie reshape, shiftdim etc., aber ich hab es nicht hinbekommen...

Danke schon mal!
Private Nachricht senden Benutzer-Profile anzeigen


breat
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 33
Anmeldedatum: 27.09.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.01.2012, 11:08     Titel:
  Antworten mit Zitat      
halt, Korrektur: es muss rand(1,n) statt rand(n,1) heißen, sorry!
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 18.01.2012, 11:12     Titel:
  Antworten mit Zitat      
hast du den speicher vorher allokalisiert? das ist normalerweise eine ursache warum forschleifen sehr langsam laufen
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast1

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.01.2012, 11:29     Titel:
  Antworten mit Zitat      
Hi,

ob du rand(1,n) oder rand(n,1) nimmst, ist in diesem Fall egal.

Bist du dir sicher, dass du so Ziehen willst?

Beim 1. mal Ziehen, ziehst du 10 Spalten aus der der Teilmatrix A(n,m,1)
Beim 2. mal Ziehen, ziehst du 10 Spalten aus der der Teilmatrix A(n,m,2)
usw.
 
breat
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 33
Anmeldedatum: 27.09.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.01.2012, 12:17     Titel:
  Antworten mit Zitat      
Bei rand(n,1) hab ich aber irgendwie eine Fehlermeldung bei der for-Schleife bekommen.

Ja, genau so möchte ich ziehen. Es soll zu jedem Zeitpunkt (letzte Dimension) eine zufällige Auswahl getroffen werden (mit Wiederholung, daher ist ja eigentlich der Begriff Permutation falsch, fällt mir gerade auf), allerdings nicht über die zweite Dimension hinweg (für m=3 bei B sollen also auch nur Werte für m=3 aus A genommen werden).

Die for-Schleife liefert mir also wirklich genau das, was ich will, auch wenn es etwas seltsam wirkt, ich habs ausprobiert. (Wenn es dich interessiert: ich brauche es für das Boot-strap-Verfahren)
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast1

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.01.2012, 12:23     Titel:
  Antworten mit Zitat      
Hat sich das Geschwindigkeitsproblem denn mit der Preallocation von B gelöst?
 
breat
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 33
Anmeldedatum: 27.09.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.01.2012, 12:33     Titel:
  Antworten mit Zitat      
nein, das ist sie natürlich schon. Die Schleife macht vor allem deshalb Probleme, weil sie wiederum in einer drin ist, um die ich nicht drum rum komme.

Was die Sache so fies macht, ist für mich, dass man jeweils nur innerhalb der zweiten Dimension ziehen darf, die Auswahl aber weder bzgl. der ersten noch der letzten Dimension gleich sein darf.
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast1

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.01.2012, 13:39     Titel:
  Antworten mit Zitat      
Wie sieht es damit aus?

Code:

B=A(randi(10,n,1),:,:);
 
 
Gast1

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.01.2012, 13:45     Titel:
  Antworten mit Zitat      
Sorry,
Die Lösung ist natürlich quatsch
 
breat
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 33
Anmeldedatum: 27.09.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.01.2012, 16:24     Titel:
  Antworten mit Zitat      
ich hab schon gedacht, dass ich die Lösung gefunden hätte. Leider Fehlalarm, da ich meine letzte Aussage korrigieren muss: das Ziehen bezüglich der ersten Dimension soll gerade gleich sein (wie man an der for-Schleife sieht)... ich glaub ich werd hier noch verrückt!
Private Nachricht senden Benutzer-Profile anzeigen
 
samsa10
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 50
Anmeldedatum: 10.12.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.01.2012, 19:05     Titel:
  Antworten mit Zitat      
Hallo!

Bin das jetzt nicht genau durchgegangen, deshalb ist es wohl nicht die schönste Variante und weiss auch nicht ob's schon lauffähig ist (nicht getestet), aber ca. so dürfte es funktionieren:
Gehe mal davon aus, deine Matrix A hat die Dimension (n x n x h) mit h>=10000.

Code:

v=ceil(n*rand(n,10000));
A=reshape(A,n*h,n);
addit=0:n:n*(10000-1);
v=bsxfun(@plus,v,addit);
B=A(v,:);
B=reshape(B,[n n 10000]);
 


Generell könnte man hier aber auch parfor empfehlen. Deine Schleife ist
keine "echte" Iteration, somit würde sich parfor anbieten und der Code bleibt damit auch übersichtlicher.

Grüße samsa
Private Nachricht senden Benutzer-Profile anzeigen
 
breat
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 33
Anmeldedatum: 27.09.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.01.2012, 12:56     Titel:
  Antworten mit Zitat      
Danke für den Vorschlag, aber leider liefert er nicht das, was ich brauche.

Aber der Tipp mit dem parfor ist echt super!! Danke!
Private Nachricht senden Benutzer-Profile anzeigen
 
Andy386
Forum-Guru

Forum-Guru


Beiträge: 485
Anmeldedatum: 24.06.09
Wohnort: ---
Version: 7.1/8
     Beitrag Verfasst am: 22.01.2012, 02:32     Titel:
  Antworten mit Zitat      
samas Code sieht aber schon gut aus...
Kannst du einen Beispieldatensatz veröffentlichen, damit man die Ergebnisse gegenrechnen kann?
_________________

Ich hasse es wenn die Leute Fragen stellen, man dann versucht sich Mühe zu geben, und diejenigen ihren Thread nie wieder besuchen...
Private Nachricht senden Benutzer-Profile anzeigen
 
breat
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 33
Anmeldedatum: 27.09.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.01.2012, 09:51     Titel:
  Antworten mit Zitat      
Ich nehme mal als Beispiel n = 3, h = 4 und

Code:

A = randi([0 9],n,n,h)
 


Dann bekomme ich z.B.

Code:

A(:,:,1) =
     7     6     5
     2     8     1
     5     9     1
 


Mit samas Code ergibt sich

Code:

B(:,:,1) =
     2     8     5
     2     6     1
     7     9     5
 


Das heißt, ich habe aus der ersten Spalte zweimal die zweite Zeile und dann die erste gezogen. Das müsste so dann aber auch in der zweiten und dritten Spalte gemacht werden, das heißt die zweite wäre dann [8 8 6]'. Genau das bekomme ich mit dieser for-Schleife.
(Wahrscheinlich habe ich mein Problem einfach nicht gut genug beschrieben, sorry...!)

Und ach ja, eigentlich ist es nicht eine (n x n x h)-Matrix, sondern eine (m x n x h)-Matrix.
Private Nachricht senden Benutzer-Profile anzeigen
 
samsa10
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 50
Anmeldedatum: 10.12.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.01.2012, 12:28     Titel:
  Antworten mit Zitat      
Hallo!

Das war etwas zu schnell, ganz so einfach geht es leider doch nicht. Falls du es dir noch selbst überlegen willst, der Fehler lag natürlich beim Reshape.
Alles in Allem war dein Problem jetzt doch noch knifflig. Smile
So sollte es funktionieren:

Code:

v=ceil(n*rand(n,10000));
A=permute(A,[1 3 2]);
A=reshape(A,n*h,n);
addit=0:n:n*(10000-1);
v=bsxfun(@plus,v,addit);
B=A(v,:);
B=reshape(B,[n 10000 n]);
B=permute(B,[1 3 2]);
 


Auf die Adaptionen für die (m x n x h) - Matrix kommst du vielleicht noch selbst.! Ansonsten melde dich.

Grüße samsa
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

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.