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

Berechneter Wert auf nächst gelegenen anderen Wert runden

 

fenderbender
Forum-Anfänger

Forum-Anfänger


Beiträge: 49
Anmeldedatum: 17.06.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.09.2010, 07:49     Titel: Berechneter Wert auf nächst gelegenen anderen Wert runden
  Antworten mit Zitat      
Hallo,

ich will einen Wert- und Zeitdiskreten Sinus erzeugen und habe dazu 4096 Werte, die der Sinus annehmen kann.

Momentan habe ich bei der Erzeugung noch

Code:

 sinus = 2047*sin(2*pi*f*t)+2047;
 


Jetzt soll aber jeder Wert des Sinus einem anderen Wert (als Vektro gespeichert) zugeordnet werden. Momentan noch als for Schleife:

Code:

 for i=1:length(sinus)
  for j=1:4096
   if sinus(i) == j
    wertdikret_sinus(i) = Messwerte(j);
  end
 end
 


Das dauert aber natürlich Ewig für einen Sinus mit vielen Punkten...

Jemand eine Idee wie es schneller geht?

Danke
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 29.09.2010, 14:02     Titel: Re: Berechneter Wert auf nächst gelegenen anderen Wert rund
  Antworten mit Zitat      
Hallo fenderbender,

Das Programm wird große Schwierigkeiten haben, da "sinus(i)==j" mit Rundungsfehlern zu kämpfen hat. Wie möchtest Du das in den Griff bekommen - ein ROUND vielleicht?

Soll der Wert von "sinus(i)" überschrieben werden, wenn mehrere passende j-Werte gefunden werden? Wenn nicht, stoppe die innere Schleife nach dem ersten Treffer (==> 50% weniger Rechenzeit) oder lasse die Schleife über 4096:-1:1 laufen und stoppe nach dem größten j mit "break" (==> auch 50% Rechenzeit).

Wie wäre es mit einer Vektorisierung?
Code:

 sinus = 2047*sin(2*pi*f*t)+2047;
 wertdikret_sinus = zeros(1, length(sinus));  % Pre-allocate!!!
 for i=1:length(sinus)
    match = find(sinus(i) == 1:4096, 'last');
    if ~isempty(match)
      wertdikret_sinus(i) = Messwerte(match);
    end
 end
 

Aber wie wäre es denn, wenn man "sinus" gleich als Index nähme?
Code:

index = round(sinus);
nonzero = (index ~= 0);
tmp = zeros(1, 4096);
tmp(nonzero) = Messwerte(index(nonzero));


Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
fenderbender
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 49
Anmeldedatum: 17.06.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.09.2010, 08:02     Titel: Re: Berechneter Wert auf nächst gelegenen anderen Wert rund
  Antworten mit Zitat      
Jan S hat Folgendes geschrieben:

Das Programm wird große Schwierigkeiten haben, da "sinus(i)==j" mit Rundungsfehlern zu kämpfen hat. Wie möchtest Du das in den Griff bekommen - ein ROUND vielleicht?

Ach stimmt, ein FLOOR war schon mal vorgesehen, is beim Debuggen aber verschwunden Wink Danke

Jan S hat Folgendes geschrieben:


Soll der Wert von "sinus(i)" überschrieben werden, wenn mehrere passende j-Werte gefunden werden? Wenn nicht, stoppe die innere Schleife nach dem ersten Treffer (==> 50% weniger Rechenzeit) oder lasse die Schleife über 4096:-1:1 laufen und stoppe nach dem größten j mit "break" (==> auch 50% Rechenzeit).


Es gibt definitiv jeden Wert nur ein einziges mal.

Jan S hat Folgendes geschrieben:

Wie wäre es mit einer Vektorisierung?
Code:

 sinus = 2047*sin(2*pi*f*t)+2047;
 wertdikret_sinus = zeros(1, length(sinus));  % Pre-allocate!!!
 for i=1:length(sinus)
    match = find(sinus(i) == 1:4096, 'last');
    if ~isempty(match)
      wertdikret_sinus(i) = Messwerte(match);
    end
 end
 


Der Tipp mit dem FIND ist gut. Auch wenn die Index-Lösung perfekt ist für das Problem hier, kann ich den FIND-Befehl an anderen Stellen gut brauchen.
Jan S hat Folgendes geschrieben:

Aber wie wäre es denn, wenn man "sinus" gleich als Index nähme?
Code:

index = round(sinus);
nonzero = (index ~= 0);
tmp = zeros(1, 4096);
tmp(nonzero) = Messwerte(index(nonzero));

Gruß, Jan


Ja klar... War gestern Montag? Wink Man, logisch gehts so am Schnellsten und Einfachsten. Vielen Dank für den Tipp!!! Das erspart ca 10sek bei einem i5-Prozessor und 4GB-Arbeitsspeicher Wink

Da hätte ich gleich noch eine weitere Optimierungsfrage. Dazu mach ich aber einen neuen Beitrag auf.

Vielen Dank für deine Unterstützung. Läuft echt prima!!
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.