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

Verbesserung meines Codes

 

elcachon
Forum-Century

Forum-Century


Beiträge: 190
Anmeldedatum: 03.05.11
Wohnort: ---
Version: 7.6.0(R2008a), 7.8.0(R2009a)
     Beitrag Verfasst am: 18.08.2011, 12:01     Titel: Verbesserung meines Codes
  Antworten mit Zitat      
Hallo,

es wäre sehr freundlich, wenn sich jemand meinen code anschauen könnte, um mir zu zeigen, wie ich es effektiver programmieren könnte(Matrizenschreibweise, statt Schleifen usw.), benutze glaub ich zuviele Abfragen!
Code:

close all
clear all
clc
load data.mat
l = 1; % Zeilenindex Matrix
for ii = 1:length(data)
    m =1;
   % Zwischenspeichern der freq - und dbV - Werte
    temp_freq = data{1,ii}(:,1);
    temp_dbV= data{1,ii}(:,2);

    for s = 1:length(temp_freq)
        % Abbruch wenn m am Ende von temp_freq
        if( m == length(temp_freq))  
          break;
        end
       
        if(temp_freq(m)~=0)
           % ja ... keine NULL vorhanden
           for q = 1:2
               % l = Laufvariable für die Zeilen
               % q = Laufvariable für die Spalten
              Matrix(l,q) = temp_freq(m);
              m = m+1;
           end
           l = l+1;
        else
        % Null getroffen    
            disp('eine Null gefunden');
            m = m + 1;
            % Bei Treffer zur inneren for loop zurück
            continue;
        end
    end
end

ich möchte die frequenzen die ich aus einem cell array in temp_freq zwischenspeichere nebeneinander in einer Matrix speichern! Momentan ist hat die Matrix 2 Spalten, wie könnte ich sie auf 4 Spalten erweitern?
Möchte die dbV Werte von temp_dbV auch noch darein speichern!

Danke schon mal
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: 18.08.2011, 15:00     Titel: Re: Verbesserung meines Codes
  Antworten mit Zitat      
Hallo elcachon,

Ein paar Ideen:
Code:
close all   % Ist das wirklich sinnvoll?
clear all   % Das ist wirklich nicht sinnvoll!
clc
load data.mat   % Es ist immer unsicher ein MAT-file zu laden ohne die Ausgabe
                      % abzufangen. Besser: data = load('data.mat');

l = 1; % Zeilenindex Matrix
for ii = 1:length(data)
    m =1;
   % Zwischenspeichern der freq - und dbV - Werte
    temp_freq = data{ii}(:,1);   % data{i} ist schneller als data{1,i}
    temp_dbV= data{ii}(:,2);

    for s = 1:length(temp_freq)
        % Abbruch wenn m am Ende von temp_freq
        if m == length(temp_freq)
          break;
        end
       
        if temp_freq(m) ~= 0
           % ja ... keine NULL vorhanden
             % for q = 1:2
             %   % l = Laufvariable für die Zeilen
             %   % q = Laufvariable für die Spalten
             %   Matrix(l,q) = temp_freq(m);
             %   m = m+1;
             % end
           Matrix(l, 1:2) = temp_freq(m:m+1);
           m = m + 2;
           l =  l+1;
        else
        % Null getroffen    
            disp('eine Null gefunden');
            % Bei Treffer zur inneren for loop zurück
            % continue;  % nicht nötig, oder?!
            m = m + 1;
        end        
    end
end

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
eupho
Forum-Meister

Forum-Meister


Beiträge: 777
Anmeldedatum: 07.01.09
Wohnort: Marburg
Version: R2009b
     Beitrag Verfasst am: 18.08.2011, 15:47     Titel:
  Antworten mit Zitat      
length(temp_freq) kannst du auch vorher einmal berechnen und dann in einer Variablen zwischenspeichern, das spart bei einer hohen Anzahl auch nochmal Zeit. Und eine if-Abfrage von nicht-Integer Variablen niemals mit == sondern mit >=.
Private Nachricht senden Benutzer-Profile anzeigen
 
elcachon
Themenstarter

Forum-Century

Forum-Century


Beiträge: 190
Anmeldedatum: 03.05.11
Wohnort: ---
Version: 7.6.0(R2008a), 7.8.0(R2009a)
     Beitrag Verfasst am: 19.08.2011, 10:00     Titel:
  Antworten mit Zitat      
Hallo Jan, hallo eupho,

vielen Dank für eure Anregungen!
Bau mir das gleich so um. Ich hofffe es nervt euch nicht, über meine simplen Programme zu schauen, aber ich möchte doch irgendwann mal in der Lage sein einen produktiven Code zu schreiben!!

Lg elcachon

Hat vielleicht von euch noch jemand eine Idee, wie ich auf einfachen weg die spalten 3 u 4 mit den dbV Werten in gleicher Weise wie die Frequenzwerte aus Spalte 1 u 2 füllen kann?

Hab das wieder mit einer for Schleife gelöst, gehts wieder einfacher??
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 19.08.2011, 10:12     Titel:
  Antworten mit Zitat      
Da dbV ja den gleichen Aufbau hat, könntest du doch einfach folgendes machen:

Code:

 if temp_freq(m) ~= 0
            % ja ... keine NULL vorhanden              
            Matrix(l, 1:2) = temp_freq(m:m+1);
            Matrix(l, 3:4) = temp_dbV(m:m+1);
            m = m + 2;
            l =  l+1;
 
Private Nachricht senden Benutzer-Profile anzeigen
 
elcachon
Themenstarter

Forum-Century

Forum-Century


Beiträge: 190
Anmeldedatum: 03.05.11
Wohnort: ---
Version: 7.6.0(R2008a), 7.8.0(R2009a)
     Beitrag Verfasst am: 19.08.2011, 10:16     Titel:
  Antworten mit Zitat      
alles klar, danke dir!!

du musst ja schon genervt von mir sein!!Wink 80% meiner Fragen beantwortest ja du!!!!Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 19.08.2011, 10:19     Titel:
  Antworten mit Zitat      
Nö..wieso? So lange jemand Willens ist, selbst an einer Lösung zu arbeiten, anstatt hier lediglich das Problem zu schildern und dann nach einem fertigen Code sucht/fragt, helfe ich gern.
Private Nachricht senden Benutzer-Profile anzeigen
 
elcachon
Themenstarter

Forum-Century

Forum-Century


Beiträge: 190
Anmeldedatum: 03.05.11
Wohnort: ---
Version: 7.6.0(R2008a), 7.8.0(R2009a)
     Beitrag Verfasst am: 19.08.2011, 11:16     Titel:
  Antworten mit Zitat      
Ich dank dir!!
Private Nachricht senden Benutzer-Profile anzeigen
 
elcachon
Themenstarter

Forum-Century

Forum-Century


Beiträge: 190
Anmeldedatum: 03.05.11
Wohnort: ---
Version: 7.6.0(R2008a), 7.8.0(R2009a)
     Beitrag Verfasst am: 19.08.2011, 12:07     Titel:
  Antworten mit Zitat      
eine frage hätt ich doch noch,

und zwar an Jan S,

Wieso ist das
Code:
close all   % Ist das wirklich sinnvoll?
clear all   % Das ist wirklich nicht sinnvoll!

nicht sinnvoll?

Ich dachte es ist wichtig den Speicher wieder neu zu bereinigen, um keine falschen Ergebnisse zu bekommen!

Lg elcachon
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 19.08.2011, 12:22     Titel:
  Antworten mit Zitat      
Ein einfaches
Code:
reicht aus um das Workspace zu leeren. Clear all löscht noch andere Sachen.
Private Nachricht senden Benutzer-Profile anzeigen
 
elcachon
Themenstarter

Forum-Century

Forum-Century


Beiträge: 190
Anmeldedatum: 03.05.11
Wohnort: ---
Version: 7.6.0(R2008a), 7.8.0(R2009a)
     Beitrag Verfasst am: 20.08.2011, 12:15     Titel:
  Antworten mit Zitat      
ah ok, alles danke, danke nochmal!!
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: 20.08.2011, 19:16     Titel:
  Antworten mit Zitat      
Hallo elcachon,

Wieso ist das
Code:
close all   % Ist das wirklich sinnvoll?
clear all   % Das ist wirklich nicht sinnvoll!


"close all" löscht alle offenen FIGUREs. Wenn man aber ein anderes Programm benutzt hat, möchte man das vielleicht gar nicht, sondern könnte eine gezeichnete Kruve z.B. für einen vergleich noch gut gebrauchen.

"clear all" löscht alle Variablen and entfernt alle Funktionen aus dem Speicher, die bereits geladen wurden. Damit verschwinden auch die Werte der PERSISTENT Variablen. Wenn eine Funktion dann wieder benutzt wird, muss sie zunächst auf der Festplatte gesucht werden, dann gelesen, danach von einem Text-File in ausführbaren Code verwandelt werden und einige Funktionen benötigen dann noch eine Initialisierung. Dies alles benötigt viel Zeit und so können Programme nach einem "clear all" schon mal um den Faktor 10'000 langsamer sein.

Das "säubern" des Speichers ist dann sinnvoll, wenn man mit Scripts arbeitet und durch Tippfehler eigentlich uninitialisierte Variablen verwendet. Z.B.:
Code:
% Im Command Window:
Aik3 = 5;  % kleines "k"
% Danach in einem Script:
AiK3 = 7;  % großes "K"
disp(Aik3 ^7);

Hier hätte nun ein "clear" (ohne "all") alle existierenden Variablen gelöscht und der DISP Befehl hätte zu einer Fehlermeldung geführt. Und eine Fehlermeldung ist 1000 mal praktischer als ein falsches Ergebnis.

Allerdings hätte das "clear" aus alle anderen Variablen im Base-Workspace gelöscht. Das mag nicht schlimm sein, solange man mit MATLAB nur winzige Scripte schreibt um mal euin wenig zu üben. Bei größeren Projekten ist das aber ausgesprochen unpraktisch. Wenn man dann eine Menge Berechnungen durchgeführt hat und dazu Grafiken erzeugt wurden, vielleicht auch noch manuell angepasst, und dann will man nur noch mal kurz schauen, ob das alte Script die gleichen Werte produzierte. Schwups, ist die gesamt Arbeit per CLEAR und CLOSE ins Nirvana gejagt. Deshaöb sollte man sich, gerade wenn man versucht MATLAB für den ernsthaften Einsatz zu lernen, angewöhnen, potentiell fiese Seiteneffekte gleich zu vermeiden.

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

Forum-Century

Forum-Century


Beiträge: 190
Anmeldedatum: 03.05.11
Wohnort: ---
Version: 7.6.0(R2008a), 7.8.0(R2009a)
     Beitrag Verfasst am: 22.08.2011, 20:49     Titel:
  Antworten mit Zitat      
Hallo Jan,

also so hat mir das noch keiner erklärt, wie gesagt, bin auch nicht so tief in Matlab drinnen und versuch einfach meine problemchen zu lösen, aber trotzdem Danke dafür. Mann kann ja nie genug wissen!!Smile

Lg elcachon
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.