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

Optimierung durch Matrizenberechung

 

Melanophila
Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 15.11.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.11.2012, 01:42     Titel: Optimierung durch Matrizenberechung
  Antworten mit Zitat      
Guten Abend,
ich hänge jetzt schon den ganzen Tag an der Optimierung von einem Auswertscript für meine Messdaten. Leider braucht das script im moment viel zu lang, und die Laufzeit nimmt überquadratisch zu, was sehr unschön ist.

Ich habe zwei von diesen Schleifen in meinem Script, es wäre also eine sehr große Hilfe wenn hier eine optimierung gelingen würde.
Ich bin für jeden Tip/Hinweis/Codeschnipsel dankbar!

Code:


while i<=length(daten)

if Reiz(1,i) >0         %Gucken ob Reiz aktiv
         if not (Reiz(1,i)>0&&Reiz(1,i-1)<0) %Auf  umschwung Reiz aktiv zu Reiz inaktiv prüfen
             jeweilsreiz=[z,data(i,1)];  %Reiznummer z einfügen und jeweilige Messdaten hinzufügen
             jeweilsreiz_array=[jeweilsreiz_array;jeweilsreiz];  %Liste draus erstellen
         end
end
     if (Reiz(1,i)>0&&Reiz(1,i-1)<0) %Wenn Umwenig von  Reiz aktiv zu inaktiv Reiznummer erhöhen
         z=z+1;
     end

i=i+1;
end


 



Reiz ist ein horizontaler vektor in der entweder 1 oder -1 steht, je nachdem ob der Reiz grade aktiv ist.
daten ist ein vertikaler vektor mit den Messdaten.
Private Nachricht senden Benutzer-Profile anzeigen


Sirius3
Forum-Guru

Forum-Guru


Beiträge: 441
Anmeldedatum: 12.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.11.2012, 02:01     Titel:
  Antworten mit Zitat      
Hallo Melano,

die beiden Zeilen
Code:
if Reiz(1,i) >0         %Gucken ob Reiz aktiv
         if not (Reiz(1,i)>0&&Reiz(1,i-1)<0) %Auf  umschwung Reiz aktiv zu Reiz inaktiv prüfen

sagen, dass erstens Reiz>0 und zweitens damit der erste Teil der zweiten Bedingung nie erfüllt ist. Es läßt sich also zusammenfassen zu:
Code:
if Reiz(1,i)>0&&Reiz(1,i-1)>=0)

Das passt aber nicht zum Kommentar. not heißt in Matlab übrigens ~.

Hier ein paar Zeilen, wie es aussehen könnte:
Code:
umschwung=diff(Reiz);
aktiv_nach_inaktiv = umschwung<0;
inaktiv_nach_aktiv = umschwung>0;
jeweilsreiz_array = data(inaktiv_nach_aktiv);


Grüße
Sirius
Private Nachricht senden Benutzer-Profile anzeigen
 
Melanophila
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 15.11.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.11.2012, 11:09     Titel:
  Antworten mit Zitat      

Optimierung durch Matrizenberechung
Klicke hier, um den Artikel bei Amazon.de anzuschauen.

Hallo Sirius,
danke für deine schnelle Antwort!

Leider trifft dein Lösungsvorschlag nicht genau das, was ich gesucht habe.

Ich habe aber mittlerweile zumindest eine Teillösung gefunden
Code:

 vorzeichen_stelle = find(sign(Reiz(1:end-1))~=sign(Reiz(2:end)));
 reiz_geht_an = vorzeichen_stelle(1,1:2:end);
  reiz_geht_aus = vorzeichen_stelle(1,2:2:end);
reiz_an= (reiz_geht_an(1,1):reiz_geht_aus(1,1)) ; %beispiel
 v = 2 * ones(length(reiz_an), 1);  
 alle_reize_an = vertcat( v', reiz_an)';

 


das findet mir die Indexstellen bei denen der Reiz an oder ausgeht.

in %Beispiel habe ich für einen Reiz, mal gemacht, was ich eigentlich auch für
Code:
reiz_an= (reiz_geht_an(1,2):reiz_geht_aus(1,2)) ;
mit entsprechendem
Code:
v = 3 * ones(length(reiz_an), 1);  

usw. brauche.

ich hab nur leider überhaupt keine idee, wie ich das dynamisch ohne eine schleife schaffen kann...
Private Nachricht senden Benutzer-Profile anzeigen
 
Sirius3
Forum-Guru

Forum-Guru


Beiträge: 441
Anmeldedatum: 12.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.11.2012, 11:59     Titel:
  Antworten mit Zitat      
Hallo,

ich habe leider jetzt überhaupt keine Ahnung, was Du eigentlich als Ergebnis
haben willst.
Kannst Du ein kurzes Beispiel mit Input- und Output-Daten posten?
Private Nachricht senden Benutzer-Profile anzeigen
 
Melanophila
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 15.11.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.11.2012, 18:04     Titel:
  Antworten mit Zitat      
Hey!
meine Inputdaten sehen folgendermaßen aus
Code:

"Time","Sensordaten","NIX","Reizspannung","NIX"
4.996,21.45,0.000000,3.99490,-240.94
4.997,21.45,0.000000,3.99490,-241.09
4.998,21.58,0.000000,3.99506,-241.24
4.999,21.54,0.000000,3.99475,-242.00
5.000,21.43,0.000000,3.99467,-241.55
5.001,21.33,0.000000,1.99753,-241.39
5.002,21.32,0.000000,0.00015,-241.55
5.003,21.32,0.000000,0.00023,-240.33
5.004,21.39,0.000000,0.00023,-240.63
5.005,21.48,0.000000,0.00023,-241.85
5.006,21.52,0.000000,0.00008,-242.00
 

rauskommen soll sowas
Code:

"Reiznummer","Sensordaten"
5   23,6500000000000
5   23,6900000000000
5   23,8000000000000
5   23,8700000000000
5   23,9000000000000
5   23,8800000000000
5   23,8700000000000
5   23,8000000000000
5   23,8600000000000
5   23,7900000000000
5   23,8700000000000
 


ist jetzt nicht beides von der gleichen Stelle, desswegen unterscheiden sich die Sensordaten.

Reiz in dem Codebeispiel von vorher ist einfach nur ein Vektor
Reiz=[-1,-1,-1,-1,1,1,1,1,1...usw]

Reizspannung in der beschriftung der Daten entspricht meinen Verktor reiz.
Der Vektor daten entspricht den Sensordaten in der Liste oben.

Immer wenn Reiz >0 ist aka die Reizspannung über meine Schwelle von 3
werden sollen die Daten gespeichert werden. Hierfür habe ich
Code:
alle_reize_an = vertcat( v', reiz_an)';

in
Code:

 alle_reize_an = horzcat( v, data(reiz_an'));
 

geändert.

Das problem ist, dass ich w also die nummer des Reizes immer hochzählen muss wenn ich einen wechsel von Reiz <0 zu Reiz>0 habe.
und genau dieses hochzählen bereitet mir kopfzerbrechen weil ich das grade nur mit einer whileschleife schaffe.
Code:
while w<=Anzahl_Reize
   
 reiz_an= (reiz_geht_an(1,w):reiz_geht_aus(1,w)) ;
 v = w * ones(length(reiz_an), 1);  
 alle_reize_an = horzcat( v, data(reiz_an'));
 jeweilsreiz_array=[jeweilsreiz_array; alle_reize_an];
w=w+1;
 


vllt Stelle ich mich da auch grade einfach was blöde an, aber ich komme irgendwie nicht drauf...
Private Nachricht senden Benutzer-Profile anzeigen
 
Sirius3
Forum-Guru

Forum-Guru


Beiträge: 441
Anmeldedatum: 12.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.11.2012, 12:07     Titel:
  Antworten mit Zitat      
also so:
Code:
sensor=in_data(:,2);
Reiz=in_data(:,4)>3;
reiz_an_aus=[Reiz(1)>0;diff(Reiz)];
reiz_num=cumsum(reiz_an_aus>0);
jeweils_reiz=[reiz_num(Reiz>0),sensor(Reiz>0)];


Grüße
Sirius
Private Nachricht senden Benutzer-Profile anzeigen
 
Melanophila
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 15.11.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.11.2012, 11:31     Titel:
  Antworten mit Zitat      
Hey Sirius!
läuft jetzt alles prima bei mir,
vielen Dank für deine Hilfe!
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.