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

super schnelle for-Schleife für 8000000 Ausführungen?

 

ovo
Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 30.03.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.04.2014, 14:24     Titel: super schnelle for-Schleife für 8000000 Ausführungen?
  Antworten mit Zitat      
Guten Tag

Ich habe eine for-Schleife, die von 1 - 8000000 geht, wie ihr euch wohl denken könnt, geht das eeeeeewigs.
Wie kann ich die auf eine nützliche Zeit herunterstutzen? max 10s

Code:
R = 0;
RBig = 0;
iBig = 0;

x = abs(compArray);
y = myArray;

N = length(myArray);
k = 0;  

for I = 1:8000000
R = 1/N * sum(x.*y);
   
   if R > RBig
      RBig = R;
      iBig = I;
   end;

y = circshift(y, [0 1]);

end;


Wäre ich schneller, wenn ich das in eine Funktion packe?
Eine Vektorisierung der for-Schleife würde es bestimmt schneller machen, aber wie kann ich das in diesem Fall machen?
Ich habe irgendwo gelesen, wenn ich meinen Variablen Typen bereits vor dem Gebrauch zuweise, so das Programm auch schneller wird. bspw: I = int32(1); Stimmt das?

Gruss
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: 07.04.2014, 14:38     Titel:
  Antworten mit Zitat      
welche dimension haben comparray und myarray ? kannst du ein lauffägies minimalbeispiel posten ?
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
ovo
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 30.03.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.04.2014, 14:43     Titel:
  Antworten mit Zitat      
Beide sind jeweils 1x8200000 gross.

Leider kann ich dir kein lauffähiges Beispiel geben, da compArray und myArray jeweils aus weiteren Files gewonnen werden.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 07.04.2014, 14:55     Titel:
  Antworten mit Zitat      
Hallo,

die Schleife geht bis 8000000, die Vektorlänge ist 82000000.
Wie steht das allgemein in Bezug zueinander?

Ich würde das gerne mit einem kleineren Beispiel testen und dann in Bezug zueinandersetzen.
Ich meine, dass
Code:

hier hilfreich sein könnte - du machst ja so eine Art moving average?

Grüße,
Harald
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: 07.04.2014, 15:17     Titel:
  Antworten mit Zitat      
das circshift scheint recht langsam zu sein.
Code:
compArray=randi(10,1,82000)-3;
myArray=randi(10,1,82000);
R = 0;
RBig = 0;
iBig = 0;
x = abs(compArray);
y = myArray;

N = length(myArray);
k = 0;  
tic
for I = 1:8000
R = 1/N * sum(x.*y);
   
   if R > RBig
      RBig = R;
      iBig = I;
   end;

    y(1:I)= myArray(N-I+1:end);
    y(I+1:end)= myArray(1:N-I);

end;

ist bei mir schonmal mehr als doppelt so schnell mit den zufalls beispielwerten. ich könnte mir vorstellen das ganze auch zu paralelisieren falls die toolbox vorhanden ist.
_________________

richtig Fragen

Zuletzt bearbeitet von Winkow am 07.04.2014, 15:23, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
ovo
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 30.03.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.04.2014, 15:21     Titel:
  Antworten mit Zitat      
In compArray ist eine willkürliche Zahlenfolge zwischen -1 und 1.
myArray ist ein Array mit 200000 generierten Werten, die nur 1 und -1 sein können, die restlichen 8000000 sind 0.

Ich versuche eine Kreuzkorrelation zu machen.
myArray erfährt bei jedem Durchgang der Schleife einen circshift, damit möchte ich eine Kreuzkorrelation an jeder möglichen Position berechnen.
Die if-Abfrage sieht nur nach, ob die Aktuelle Korrelation grösser ist als die Vorhergehende, wenn ja, wird die Aktuelle gespeichert.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 07.04.2014, 16:04     Titel:
  Antworten mit Zitat      
Hallo,

hilft dir
Code:

?

Wenn ein Großteil der Einträge Nullen sind, dann ist die Multiplikation ja überflüssig. Vielleicht kann man das geschickter machen? Sind die von 0 verschiedenen Einträge denn am Stück?

Ein kleines, komplett reproduzierbares Beispiel wäre hilfreich.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
ovo
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 30.03.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.04.2014, 16:14     Titel:
  Antworten mit Zitat      
myArray ist beim ersten Durchgang der for-Schleife myArray = [1, -1, 1, -1, -1, -1, 1, ..., 1, 0, 0, ..., 0 ] die ersten 200000 Einträge sind Werte zwischen 1 und -1 und die restlichen 8000000 sind 0.

Beim zweiten Durchgang ist myArray = [0, 1, -1, 1, -1, -1, -1, 1, ..., 1, 0, 0, ..., 0] ist der erste Wert 0, die Werte an der Stelle 2 bis 200001 sind 1 oder -1 und die restlichen 7999999 sind 0.

usw.

Wenn man bei myArray die 0er weglassen kann für die Multiplikation, wäre mein Programm wahrscheinlich schneller. Aber Matlab lässt doch eine Matrixmultiplikation nur zu, wenn die Matrizen jeweils gleich gross sind, oder?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 07.04.2014, 16:51     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Aber Matlab lässt doch eine Matrixmultiplikation nur zu, wenn die Matrizen jeweils gleich gross sind, oder?

Du kannst ja vom zweiten Array per Indizierung nur den Teil extrahieren, der gerade benötigt wird.

Bitte auf die Fragen eingehen. Ich habe ja filter und xcorr vorgeschlagen.

Meines Erachtens sollte sich die komplette Rechnung reduzieren lassen auf etwas der Form:
Code:
R = filter(myArray(1:200000), 1, x)/N;
[RBig2, IBig2] = max(R)


Soweit ich sehen kann, gibt es bei RBig2 leichte, durch numerische Abweichungen bedingte Ungenauigkeiten. Bei IBig2 blicke ich noch nicht ganz durch, aber auch das sollte hinzubekommen sein.

Bei mir braucht da ein Beispieldurchlauf 0,03s.

Grüße,
Harald
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.