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

strcat zum Befüllen von Matrizen benutzen

 

seppl123
Forum-Anfänger

Forum-Anfänger


Beiträge: 16
Anmeldedatum: 06.07.08
Wohnort: Stuttgart
Version: 7.4.0
     Beitrag Verfasst am: 27.09.2010, 14:34     Titel: strcat zum Befüllen von Matrizen benutzen
  Antworten mit Zitat      
Hallo,

ich versuche gerade ein Script zu schreiben, welches mir ermöglicht viele Messdaten bequem einzulesen und automatisiert auszuwerten.

Jede Messung wurde 5 mal wiederholt und bei verschiedenen Temperaturen wiederholt, hier Beispiele wie die Dateinamen sind:

Messung_50Grad_v01
Messung_50Grad_v02
Messung_50Grad_v03
Messung_50Grad_v04
Messung_50Grad_v05

Messung_100Grad_v01
Messung_100Grad_v02
usw.

Eingelesen hab ich die Daten jetzt mittels folgendem Code:

Code:

for temperatur = 50:50:100 %Temperatur
     for volume = 1:1:5 %Laufvariable
     fid = fopen(strcat('Messung_',num2str(temperatur),'Grad_v','0',num2str(volume))); %Datei öffnen
     data = textscan(fid,'%s %s %s %s','Delimiter',';','headerlines',20); %Daten auslesen  
fclose(fid);
    end

 


Das funktioniert auch ganz gut. Jetzt will ich die Daten die ich dort lade, zusammen in einer Matrix speichern. Beispielsweise will ich jeweils die erste Spalte der 5 Messungen bei 50 Grad zusammen in einer Matrix speichern.

Wie kann ich hier den Befehl strcat einbauen? Folgendes hier funktioniert nicht:

Code:

strcat('frequenz',num2str(temperatur))(:,volume) = data{1}
%Speichern der Daten aus Spalte 1 in eine neue Matrix, Messung v01 in Spalte 1, Messung 2 in Spalte 2, usw.
 


Es soll also hier eine Matrix entstehen, welche beispielsweise frequenz50 heißt und in 5 Spalten jeweils alle Frequenzwerte aus den Messungen v01, v02, v03, v04 und v05 gespeichert werden.

Kann mir jemand helfen wie ich das schaffe?
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: 27.09.2010, 15:46     Titel: Re: strcat zum Befüllen von Matrizen benutzen
  Antworten mit Zitat      
Hallo Seppl123,

Zitat:
Es soll also hier eine Matrix entstehen, welche beispielsweise frequenz50 heißt ...

Mach das nicht. Dieses Forum wimmelt von Fragen, wie man nachher wieder elegant auf "frequenz50" zugreifen kann. Und dann soll das Programm auf 10.000 verschiedene Werte erweitert werden und wird ganz überraschen langsam...

Es ist viel sauberer, sicherer, wartbarer und logischer die Variablen mit einem entsprechenden Index abzuspeichern, z.B. "frequenz(50)" oder "frequenz(50, :, :)" oder "frequenz{50}" oder "frequenz.Spec = '50'; frequenz.Data = rand(1,100)".
Die Namen der Variablen mit Beutung zu versehen ist eine programmiertechnische Sackgasse. Die Römer haben zwar auch ihre Söhne durchnummeriert, aber es ist ja auch bekannt, was aus dem Römischen Reich geworden ist...

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 16
Anmeldedatum: 06.07.08
Wohnort: Stuttgart
Version: 7.4.0
     Beitrag Verfasst am: 28.09.2010, 14:35     Titel:
  Antworten mit Zitat      
Hallo,

danke für deinen Tip. Erstmal vorweg: Ich bin kein Programmierer, somit habe ich das "Handwerk" nicht sehr gut erlernt. Matlab hab ich mir selbst beigebracht via Internet. Aus diesem Grund werden meine Skripte auch immer sehr groß. Beim aktuellen Skript habe ich ca. 2000 Zeilen für das Einlesen der Messdaten und ersten Verarbeitung.

Um das Programm nicht weiter aufzublähen würde ich bestimmte Zeilen gerne nur einmal schreiben und nicht für jeden Messdatensatz einzeln. Das sehe ich auch so als sinnvoll an, da mein Programm mit jeder Zeile langsamer wird.

Dazu benötige ich aber oben geschriebenes. Ich lese in einer for-Schleife die verschiedenen Datensätze (50 Grad, 100 Grad, 150 Grad, 200 Grad, usw.) und will dann alle Messdaten nach dem gleichen Prinzip auswerten und abspeichern. Dazu erscheint es mir schon sinnvoll die entsprechenden Befehle jeweils nur einmal zu programmieren und dann beim Abspeichern der Daten nur jeweils andere Namen zu vergeben.

Aus diesem Grund auch die Nachfrage nach der richtigen Anwendung von strcat.

PS: Ich versuche gerade auf anderem Wege das aufgeblähte Skript zu verkürzen. Ziel sind ca. 500 Zeilen statt 2000 Smile
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, 15:30     Titel:
  Antworten mit Zitat      
Hallo seppl123,

Zitat:
Um das Programm nicht weiter aufzublähen würde ich bestimmte Zeilen gerne nur einmal schreiben und nicht für jeden Messdatensatz einzeln. Das sehe ich auch so als sinnvoll an, da mein Programm mit jeder Zeile langsamer wird.

Ein Programm wird mit jeder Zeile langsamer, wenn man die Anzahl der Variablen erhöht. Je mehr Variablen Du hast, desto länger sind die Tabellen, die Matlab durchsuchen muss, wenn es auf eine Variable zugreifen möchte.
Code:
A = [1, 2];
disp(A(1))
disp(A(2))

ist dewegen dramatisch effizienter bezüglich Speicherplatz und Zugriffsgeschwindigkeit als:
Code:
A1 = 1;
A2 = 2;
disp(A1)
disp(A2)

Zugegebenermaßen kann man bei 2 Variablen den Unterschied nur mit sehr großem Aufwand messen. Bei 1000 Variablen fällt das aber sehr ins Gewicht. Wenn man dann noch die Variablen-Namen dynamisch erzeugt, z.B. mit STRCAT und per EVAL darauf zugreift, hat Matlab überhautp keine Chance mehr, per JIT-Acceleration seine magischen Beschleunigungs-Methoden anzuwenden. Für zur Zeit der Komplierung (also beim ersten Einlesen des Files) bekannte Variablennamen kann Matlab nämlich schon die Indices aus einer statischen Tabelle auslesen und gleich ins Programm einfügen. Deshalb wird Matlab auch ausgebremst, wenn man eine bestimmte Variable immer wieder mit unterschiedlichen Typen belegt:
Code:

function Test  % Muss in einer Funktion stehen!
a = 3;
b = uint8(3);
c = uint32(3);
tic
  for i=1:1e5
    v = a;
    v = b;
    v = c;
    clear('v');
  end
toc   % 1.04 sec

a = 3;
b = 4;
c = 5;
tic
  for i=1:1e5
    v = a;
    v = b;
    v = c;
    clear('v');
  end
toc   % 0.8 sec, 25% schneller
 

Und dann versuche das mal ohne "clear('v')" !

Deshalb gebe ich Dir den Rat: Konstruiere keine Variablen-Namen während der Laufzeit.
In der englischsprachigen CSSM-Newsgroup lautet die Antwort auf diese und ähnliche Fragen nach tausenden von Diskussionen nur noch: "Don't do it."

Matlab hat ein enormes Potential - viel Spaß beim Lernen!
Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
seppl123
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 16
Anmeldedatum: 06.07.08
Wohnort: Stuttgart
Version: 7.4.0
     Beitrag Verfasst am: 02.10.2010, 22:37     Titel:
  Antworten mit Zitat      
Vielen Dank für deine ausführliche Antwort. Ich werd es mal probieren, hab grad viel gelernt... Cool
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: 04.10.2010, 15:03     Titel: Re: strcat zum Befüllen von Matrizen benutzen
  Antworten mit Zitat      
Hallo seppl123,

Zitat:
Code:

strcat('frequenz',num2str(temperatur))(:,volume) = data{1}
%Speichern der Daten aus Spalte 1 in eine neue Matrix, Messung v01 in Spalte 1, Messung 2 in Spalte 2, usw.
 

Du möchtest also Aufwand betreiben, um dynamisch einen komplizierten Variablen-Namen erzeugen zu können, der den Index bereits als Namen eingebaut hat.
Wenn ich mir die vielen hundert ähnlichen Anfragen zu diesem Thema in diesem Forum anschaue, wird es dann ein paar Tage dauern, und dann fragst Du, wie Du dynamisch auf komplizierte Variablen-Namen wieer zugreifen kannst, in denen der Index innerhalb des Namens verborgen ist.

Darum antworte ich wie immer: Mach das nicht.
Wenn "temperatur" ein numerischen Messwert ist, verstecke ihn nicht im Namen. Benutze lieber Ein Struct mit dem Feld "Temperatur". Das gleiche für "volumen".
Später kann man das per numerischem Vergleich auch wieder finden:
Code:

A(1).Temperatur = 50;
A(1).Volumen = 200;
A(1).AndereDaten = rand(5);
A(2).Temperatur = 60;
A(2).Volumen = 400;
A(2).AndereDaten = rand(5);

% Find Index von A für Temperatur == 50:
A([A.Temperatur] == 50);
 

Du kannst in diesem Forum nach EVAL suchen und von den zahlreichen Problemen von dynamisch erzeugten Variablen lesen.

Gruß, Jan
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.