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

Array-Operationen - Navigieren, Subtrahieren, Performance...

 

joekey
Forum-Century

Forum-Century


Beiträge: 169
Anmeldedatum: 03.04.08
Wohnort: Wien
Version: 2011b
     Beitrag Verfasst am: 15.12.2008, 22:52     Titel: Array-Operationen - Navigieren, Subtrahieren, Performance...
  Antworten mit Zitat      
Hallo,

ich versuche ein paar Operationen an einen kleinen Array durchzuführen und stoße an folgende Probleme:

Beispiel:

Code:

dur = 3;
sig = [0 0 0 0 0 1 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 -1 0 0 0 0]';
val1 =  [1 2 3 7 5 4 6 8 2 3 4 5 2 6 4 5 6 7 1 2 3 7 5 4 6 8 2 3 4 5 2 6 4 5 6 7]';
val2 =  [1 1 2 3 2 3 4 5 2 3 4 2 1 5 3 4 2 3 5 5 6 8 6 4 5 7 6 3 5 4 6 8 7 6 6 5]';

tr = zeros(size(sig,1),1);
tr(find(sig(:,1)==1)+1:find(sig(:,1)==1)+dur) = 1;
tr(find(sig(:,1)==-1)+1:find(sig(:,1)==-1)+dur) = -1;

ret = zeros(size(sig,1),1);
ret(find(tr == 1)) = val2(find(tr == 1)) - val2(find(tr == 1)-1);
ret(find(tr == -1)) = -1*(val2(find(tr == -1)) - val2(find(tr == -1)-1));

eq = cumsum(ret);
[sig tr val1 val2 ret eq]
 


- sig is eine Signal array mit 0,1 und -1
- bei einem 1 oder -1 Signal in sig Spalte soll:
- in "tr" Spalte, eine Zeile verschoben (also eine Zeile nach der Zeile mit dem Wert 1 oder -1 in der Spalte sig), in "dur" definierte Anzahl der 1 oder -1 je nach dem Signal hinzugefügt werden. Das klappt bei ersten erscheinen von dem Signal 1 und -1, jedoch nicht bei den weiteren. Das kann ich nicht nachvollziehen. Ich würde dabei nur sehr ungern eine for Schleife benutzen, da ich diese Operationen an sehr großen Arrays anwenden will und eine for Schleife würde die Performance erheblich verschlechtern.
- als nächstes würde ich gern ein "ret" - Wert berechnen. Und Zwar jeweil in Zeilen mit 1 und -1 in "tr" Spalte. Wobei die erste Zeile im Signalblock soll mit val2-val1 berechnet werden und das Ergebniss soll in gleiche Zeile in der Spalte "ret" gespeichert werden. Die restlichen Zeilen im Signalblock sollen gleich berechnet werden wie bereit implementiert. Also "val2(x,1)-val2(x-1,1)". Das berechnen von "eq" klappt ohne weitere Probleme.

Ich hoffe ich habe euch nicht erschrocken. Hoffentlich versteht ihr mich, sonnt fragt mich bezüglich Unklarheiten.

Danke für jeden Hinweiss.

LG Joe.

Für die Übersichtlichkeit habe ich noch eine Grafik angegängt.

falscheAusgabe.tif
 Beschreibung:
 Dateigröße:  246.54 KB
 Angeschaut:  1740 mal

falscheAusgabe.tif

Private Nachricht senden Benutzer-Profile anzeigen


joekey
Themenstarter

Forum-Century

Forum-Century


Beiträge: 169
Anmeldedatum: 03.04.08
Wohnort: Wien
Version: 2011b
     Beitrag Verfasst am: 16.12.2008, 09:59     Titel:
  Antworten mit Zitat      
Hallo,

mit dem oben beschriebenen Problemen, habe ich folgende Änderungen durchgeführt:

Code:

dur = 3;
k = 1; %enter delay
sig = [0 0 0 0 0 1 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 -1 0 0 0 0]';
val1 =  [1 2 3 7 5 4 6 8 2 3 4 5 2 6 4 5 6 7 1 2 3 7 5 4 6 8 2 3 4 5 2 6 4 5 6 7]';
val2 =  [1 1 2 3 2 3 4 5 2 3 4 2 1 5 3 4 2 3 5 5 6 8 6 4 5 7 6 3 5 4 6 8 7 6 6 5]';

trE = sig([ ones(1,2) 1:end-k ])

trR = zeros(size(sig,1),1);
trR(find(sig(:,1)==1)+2:find(sig(:,1)==1)+dur) = 1;
trR(find(sig(:,1)==-1)+2:find(sig(:,1)==-1)+dur) = -1;

trA = zeros(size(sig,1),1);
trA(find(sig(:,1)==1)+1:find(sig(:,1)==1)+dur) = 1;
trA(find(sig(:,1)==-1)+1:find(sig(:,1)==-1)+dur) = -1;

ret = zeros(size(sig,1),1);
ret(find(trE == 1)) = val2(find(trE == 1)) - val1(find(trE == 1));
ret(find(trE == -1)) = -1*(val2(find(trE == -1)) - val1(find(trE == -1)));

ret(find(trR == 1)) = val2(find(trR == 1)) - val2(find(trR == 1)-1);
ret(find(trR == -1)) = -1*(val2(find(trR == -1)) - val2(find(trR == -1)-1));

eq = cumsum(ret);
[sig trE trR trA val1 val2 ret eq]
 


-trE -> signalisiert den Anfang des Signalblocks und wird weiter bei der Berechung von "ret" benutzt (Funktioniert)
-trR -> sind die restlichen Stellen des Signalblocks und werden auch bei der Berechnung von "ret" benutzt. (Funktioniert)
-trA -> stellt das gesamte Signalblock. Dient nur zur Überprüfung.
- was noch immer noch nicht klappt ist eben, dass:
- in der Spallte "trR" klappt das Hinzufügen des Signalls nur bei ersten erscheinen von dem Signal 1 und -1 in der Spalte "sig", jedoch nicht bei den weiteren. Das kann ich nicht nachvollziehen. Ich würde dabei nur sehr ungern eine for Schleife benutzen, da ich diese Operationen an sehr großen Arrays anwenden will und eine for Schleife würde die Performance erheblich verschlechtern.

- zusätzlich habe ich noch die Berechnung von sig (bei dem die Spalte um n-Stellen nach unten verschoben wird) verenfacht. Hier ein Beispiel:

>> a = [ 2 3 4 5 6 7]
a =
2.00 3.00 4.00 5.00 6.00 7.00
>> k = 1
k =
1.00
>> a([ ones(1,k) 1:end-k ])
ans =
2.00 2.00 3.00 4.00 5.00 6.00
>> ones(1,k)
ans =
1.00
>>
Ich kann aber nicht nachvollziehen, wie werden die führenden "ones" zu 2.0? Eigentlich will ich die führenden, ersetzten Zeichen als 0 darstellen. Wenn ich aber folgendes ausführe, bekomme ich ein Fehler:

>> a([ zeros(1,k) 1:end-k ])
??? Subscript indices must either be real positive integers or logicals.

Danke für alle Hinweise.

LG Joe
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 - 2024 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.