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

Code Ausschnitt ersetzen - Idee aus Präprozessor

 

pooz
Forum-Anfänger

Forum-Anfänger


Beiträge: 49
Anmeldedatum: 04.05.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.05.2009, 12:38     Titel: Code Ausschnitt ersetzen - Idee aus Präprozessor
  Antworten mit Zitat      
Hallo Leute,

ich möchte gerne in einer Zeile eine Variable ersetzen. Und dieses abhängig davon, was der Benutzer mittles eines Radio-Buttons gewählt hat.

Der Benutzer hat 3 Möglichkeiten zu Auswahl: Er ersetzt die Variable entweder durch einen Vektor, oder durch jeweils eine der beiden Matrizen.

Bisher hab ich immer per Hand, je nach dem welchen Modus ich haben wollte, eine Zeile auskommentiert.

Ich denke ein Code (gekürzte Fassung) sagt mehr als meine vielen Worte:
Code:
for j=1 : N
    for k=1 : v
          i_frac(k,j)   = sin (2 * pi * f(k)/(Fs) * (j-1);
%         i_frac(k,j)   = sin (2 * pi * f_a(k,j)/(Fs) * (j-1);
%         i_frac(k,j)   = sin (2 * pi * f_r(k,j)/(Fs) * (j-1);
    end
end

Die Zeilen sind bis auf die Variablen "f" (vektor), "f_a" (Matrix), "f_r" (Matrix) identisch. Ich möchte diese zu einer Zusammenfassen, die verschidenen Variablen durch eine namens "freq" ersetzen.

Eine Switch-Anweisung vor der Schleife soll entscheiden, welche meiner 3 Variablen eignesetzt wird.
Die Probleme sind:
1: Ich möchte ungern in der Schleife eine if oder switch/case abfrage.
2: In der ersten Zeile hab ich einen Vektor-Index, in den beiden anderen dagegen 2 Matrix indizes

Die einzige Methode, die mir einfällt, wäre eine reine String-substitution. Kriege das aber nicht hin.
Mit Symbole hab ich das auch probiert, jedoch geht das mit der Anzahl an verschiedenen Indizes nicht.

Für jegliche hilfe bin ich dankbar
gruß!
Private Nachricht senden Benutzer-Profile anzeigen


denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 28.05.2009, 13:58     Titel:
  Antworten mit Zitat      
Hallo,

da sollst vielleicht mit eval probieren

ungefähr so, musst aber an dein code anpassen:

Code:


% hier radio_button abfragen,
% in UserData kannst dein eigenes Wert ablegen,
% schon bei initialisieren
% z.B: value = get(radio_button_handle,'UserData')
value=1;
switch(value)
   case 1
      freq = 'sin (2 * pi * f(k)/(Fs) * (j-1)';
   case 2
      freq=  'sin (2 * pi * f_a(k,j)/(Fs) * (j-1)';
   case 3
      freq=  'sin (2 * pi * f_r(k,j)/(Fs) * (j-1)';
end


for j=1 : N
    for k=1 : v
         eval(['i_frac(k,j)   =',freq,';']);
    end
end

 
Private Nachricht senden Benutzer-Profile anzeigen
 
pooz
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 49
Anmeldedatum: 04.05.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.05.2009, 14:56     Titel:
  Antworten mit Zitat      
jap,
vielen dank! Hatte ich bereits probiert, und verlangsamt meine Schleife leider ungemein!

(Es werden Audio-Dateien prozessiert. Bei bspw. 200000 Samples dauert das leider merklich mehr als ohne)

Gibt es eine andere Möglichkeit?
Danke!!
Private Nachricht senden Benutzer-Profile anzeigen
 
steve
Ehrenmitglied

Ehrenmitglied



Beiträge: 2.022
Anmeldedatum: 03.09.07
Wohnort: Wien
Version: R2023b
     Beitrag Verfasst am: 28.05.2009, 15:00     Titel:
  Antworten mit Zitat      
Moin,

kurze Frage:
warum keine Switch-Abfrage in der Schleife?

Gruß
Alex
_________________

>> I told me to.

____________________________________
Matlab Cheat Sheet
goMatlab-Knigge - dran gehalten?!
Schon in den FAQ gesucht?
Ist vielleicht bei den Skripten oder den Tutorials was für dich dabei?
Private Nachricht senden Benutzer-Profile anzeigen
 
pooz
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 49
Anmeldedatum: 04.05.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.05.2009, 15:22     Titel:
  Antworten mit Zitat      
Moin,

um die Switch-Abfrage geht es nicht. Der Befehl "eval" in der Schleife, ist das Problem. Anscheinend benötigt der viel Rechenzeit.
Private Nachricht senden Benutzer-Profile anzeigen
 
steve
Ehrenmitglied

Ehrenmitglied



Beiträge: 2.022
Anmeldedatum: 03.09.07
Wohnort: Wien
Version: R2023b
     Beitrag Verfasst am: 28.05.2009, 15:27     Titel:
  Antworten mit Zitat      
Ich weiß das eval viel Zeit benötigt - aber du hast in deinem ersten Post geschrieben:
pooz hat Folgendes geschrieben:
1: Ich möchte ungern in der Schleife eine if oder switch/case abfrage.


Darauf bezog sich meine Frage.

Gruß
Alex
_________________

>> I told me to.

____________________________________
Matlab Cheat Sheet
goMatlab-Knigge - dran gehalten?!
Schon in den FAQ gesucht?
Ist vielleicht bei den Skripten oder den Tutorials was für dich dabei?
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 28.05.2009, 15:43     Titel:
  Antworten mit Zitat      
Das stimmt es verlangsamt,
dein Code wg der Schleifen ungemein.

Wenn bei dir Vektor auftritt, Welche werte hat N

Zitat:
"f" (vektor), "f_a" (Matrix), "f_r" (Matrix) identisch.


sonst kanst du dein vektor zu matrix aufblasen
Code:

%
%
value=1;
switch(value)
   case 1
      freq = repmat(f,1,N))
   case 2
      freq=  f_a;
   case 3
      freq=  f_r;
end


for j=1 : N
    for k=1 : v
         i_frac(k,j)   =sin (2 * pi *freq(k,j)/(Fs) * (j-1);
    end
end
 


Edit: die Klammer Anzahl stimmt irgendwie nicht
Private Nachricht senden Benutzer-Profile anzeigen
 
pooz
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 49
Anmeldedatum: 04.05.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.05.2009, 16:59     Titel:
  Antworten mit Zitat      
@ Alex
Selbstverständlich, du hast Recht! Entschuldige, hab gar nicht an den Ausgangspost mehr gedacht.
Zur Aussage: Vermeiden wollte ich die if-Abfrage, da diese in Schleifen Ewigkeiten dauert.

@ denny
Japp! Hatte ich auch mal dran gedacht, aber ich bin schnell wieder davon abgekommen, das aufzublasen. Grund: N beträgt bspw. 200000. Das sind die Anzahl an Samples aus Audio-Dateien.
Ich konnte es nicht mit mir vereinbaren, eine so große, redundante Matrix zu basteln Smile
Dann hätte ich es lieber nicht mathematisch sondern per "Code-Ersetzung" umsetzen wollen. Und hier bin ich nun gelandet Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
steve
Ehrenmitglied

Ehrenmitglied



Beiträge: 2.022
Anmeldedatum: 03.09.07
Wohnort: Wien
Version: R2023b
     Beitrag Verfasst am: 28.05.2009, 17:21     Titel:
  Antworten mit Zitat      
If-Abfragen dauern lange, das stimmt, allerdings sollte eine switch-Anweisung ein relativ schnelles Ergebnis bringen...

Gruß
Alex
_________________

>> I told me to.

____________________________________
Matlab Cheat Sheet
goMatlab-Knigge - dran gehalten?!
Schon in den FAQ gesucht?
Ist vielleicht bei den Skripten oder den Tutorials was für dich dabei?
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 28.05.2009, 17:36     Titel:
  Antworten mit Zitat      
In diesem Fall ist eine if noch günstig,
Laufzeit beträgt ja da ca. n(n+n)= 2*n^2=O(n^2)
Das heißt, da for Schleifen mehr Laufzeit benötigen wird man eine If-Abfrage praktisch nicht spüren.

probier mal so:
Code:

%
%
value=1;
switch(value)
   case 1
      freq = f;
   case 2
      freq=  f_a;
   case 3
      freq=  f_r;
end

s_freak = size(freq,2);

for j=1 : N
    for k=1 : v
         freak_val = freq(k);
         if j <= s_freak
            freak_val=freq(k,j);
         end
         i_frac(k,j)   =sin (2 * pi *freak_val/(Fs) * (j-1);
    end
end
 
Private Nachricht senden Benutzer-Profile anzeigen
 
pooz
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 49
Anmeldedatum: 04.05.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.05.2009, 18:13     Titel:
  Antworten mit Zitat      
Vielen Dank, ihr Beiden!!

Jetzt haben wir 4 Ergebnisse. Ich fasse zusammen:
1) Text-Ersetzung mittels "eval" (Dauert zu lange)
2) Vektor aufblasen mittels "repmat"
3) if-Abfrage in der For-Schleife (siehe Post direkt hiervor)
4) 3 Mal den ganzen Quell-Code kopieren, und jeweils diese eine Zeile anpassen. Mit einer If-Abfrage vor jedem Block überprüfen, welcher Block ausgeführt werden soll. (Mein bisheriger Workaround)


Frage
Welches der Methoden 2,3 oder 4 ist am schnellsten?


Danke!
pooz


BTW: /SideToppic.
Wo wir gerad dabei sind: Was ist schneller, switch oder ifelse ?
Code:

if value == 1
      freq = f;
ifelse value == 2
      freq=  f_a;
ifelse value == 3
      freq=  f_r;
end
 

oder
Code:
switch(value)
   case 1
      freq = f;
   case 2
      freq=  f_a;
   case 3
      freq=  f_r;
end
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 28.05.2009, 19:27     Titel:
  Antworten mit Zitat      
Aus Sicht der Informatik, ist SWITCH und IF gleich schnell.
SWITCH ist einfach etwas übersichtlicher struktuiert.

Auf Laufzeit eine Schleife wirkt sich mehr die Anzahl der Verzweigungen und auch Anzahl der Vergleiche spielt eine Rolle. Vergleicht man Arrays oder Konstanten miteinander, das macht ein großes Unterschied.


Edit: Besser zu jedem Beispiel:
wenn ich richtig die Laufzeit berechnet habe, dann sieht es so aus
2) Worst Case n^2+n^2 = 2n^2 (mit repmat): BestCase n^2+1
3) Worst Case 4n^2+4 BestCase: 3n^2+4
4) Worst Case 4n^2 BestCase: 2n^2
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.