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

Variablen erzeugen

 

go_progen
Forum-Anfänger

Forum-Anfänger


Beiträge: 35
Anmeldedatum: 11.11.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.11.2008, 18:26     Titel: Variablen erzeugen
  Antworten mit Zitat      
Moin Moin,

ich hab da mal ne Frage, die mag vllt dem Einen oder Anderen schon mal über den Weg gelaufen sein, aber ich schnalls nicht, bzw. es will nicht.

Folgendes Problem:

In einer Ascii-Datei stehen verschieden Messkanäle, die ich soweit auch eingelesen bekommen. Ich habe eine 6x1 Zelle mit den Überschriften und eine Matrix "beliebig"x6-Felder. Nun möchte ich entsprechend den Überschriften Variablen bezeichnen, und Ihnen die dazugehörigen Spalten der Matrix zuweisen.

Ich hab nu schon viel mit "eval" rumprobiert, komme aber nicht so richtig auf einen grünen Zweig. Was kann ich da besser machen?
Private Nachricht senden Benutzer-Profile anzeigen


Schrank
Forum-Century

Forum-Century


Beiträge: 203
Anmeldedatum: 10.07.08
Wohnort: Berlin
Version: ---
     Beitrag Verfasst am: 11.11.2008, 18:57     Titel:
  Antworten mit Zitat      
Hallo go_progen,
das sollte ungefähr so aussehen:
Code:

Name = 'text';
A = rand(3,3);
eval([Name, '=A'])


bzw. dann

Code:

eval([Name{1}, '=A(:,1)']);
 


Gruß Schrank

Zuletzt bearbeitet von Schrank am 11.11.2008, 21:20, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
go_progen
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 35
Anmeldedatum: 11.11.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.11.2008, 20:59     Titel:
  Antworten mit Zitat      
Danke für die Hilfe, jedoch klappt es immer noch nicht bei mir....hier mal mein code...

Code:

file_id = fopen('msttoasc.asc', 'r','l');
heading = fgetl(file_id);
channelname = channel(heading);
x = dlmread('msttoasc.asc',';',1,0);
x(:,size(x,2))=[];

for i=1:length(channelname)
    tmp2 = char(channelname{i,1});      %Namen des Channels auslesen
    tmp=x(:,i);                         %Spalte auswählen, die versetzt werden soll
    eval([tmp2, ' = tmp']);          
end
 


Als Fehlermeldung kommt dann "Error: Unexpected MATLAB expression." in der eval-Zeile.
Ich steh echt auf dem Schlauch. Herr Schrank
Private Nachricht senden Benutzer-Profile anzeigen
 
Schrank
Forum-Century

Forum-Century


Beiträge: 203
Anmeldedatum: 10.07.08
Wohnort: Berlin
Version: ---
     Beitrag Verfasst am: 11.11.2008, 21:24     Titel:
  Antworten mit Zitat      
mmh, Hilfe die nicht hilft ist schlechte Hilfe...
Aber ich muss ehrlich sagen das ich da auch keinen Fehler sehe. Ich hab keine Ahnung was die Zeile
Code:
channelname = channel(heading);
macht, aber wenn in tmp2 ein String und in tmp ein Array aus Zahlen steht sollte das eigentlich so funktionieren. Ich vermute du hast dir die beiden Variablen im Debugger mal angesehen?
Funktioniert mein oberes Minimalbeispiel?
Private Nachricht senden Benutzer-Profile anzeigen
 
go_progen
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 35
Anmeldedatum: 11.11.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.11.2008, 22:03     Titel:
  Antworten mit Zitat      
Code:
channelname = channel(heading);


Damit wird die Kopfzeile eingelesen und eine Zelle 6x1 erzeugt in der alle Kanalüberschriften stehen.
Mit dem Debugger bin ich schon mal drüber gewesen, aber so richtig versteh ichs nicht! Dein Beispiel funzt, zumindest der erste Teil, den 2ten hab ich nicht lauffähig bekommen:(

Nebenbei hat sich ergeben, das tmp2 nicht als string erkannt wird, ich bleib dran.

Hast du sonst noch ne Idee, wie ich das anders umsetzen könnte?
Private Nachricht senden Benutzer-Profile anzeigen
 
Schrank
Forum-Century

Forum-Century


Beiträge: 203
Anmeldedatum: 10.07.08
Wohnort: Berlin
Version: ---
     Beitrag Verfasst am: 12.11.2008, 13:04     Titel:
  Antworten mit Zitat      
Hi,
also das Problem ist das tmp2 kein string ist. Kannst du mal eine Beispieldatei hochladen?
Private Nachricht senden Benutzer-Profile anzeigen
 
go_progen
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 35
Anmeldedatum: 11.11.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.11.2008, 14:34     Titel:
  Antworten mit Zitat      
Das kann sein, aber char weist der Variablen doch einen String zu?!
Ich hab mittlerweile die Funktion Namen in eine Cell zuweisen alleine gemacht... mein vorerst kompletter Code ist hier:

Die datei asc = ascii , einfach nur ein andere Name als txt....


Code:
clear all;
clc;
%open file
file_id = fopen('msttoasc.asc', 'r','l');
%erste Zeile einlesen
heading = fgetl(file_id);
%aus der ersten Zeile die Kanalnamen extrahieren und in cell speichern
A=strfind(heading,';');

for i=1:length(A)
    if i==1  
        name{i}=heading(1:A(i)-1);
    else
        name{i}=heading(A(i-1)+1:A(i)-1);
    end
end
clear i;
%Zahlenwerte einlesen, letzte Spalte löschen, da zuviel durch semikolon
x = dlmread('msttoasc.asc',';',1,0);
x(:,size(x,2))=[];

%Erstellen von Variablen mit den Werten der Kanäle
for j=1:length(A)
    tmp = char(name{j});      %Namen des Channels auslesen
    data=x(:,j);                %Spalte auswählen, die versetzt werden soll
    eval([tmp, '=data']); %tmp2 muss als string gemacht werden!
end

%pointer schließen
fclose(file_id);


MSTtoASC.txt
 Beschreibung:

Download
 Dateiname:  MSTtoASC.txt
 Dateigröße:  2 KB
 Heruntergeladen:  457 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
go_progen
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 35
Anmeldedatum: 11.11.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.11.2008, 17:20     Titel:
  Antworten mit Zitat      
So, die Lösung des Problems ist, dass der String Sonderzeichen enthielt, also "[" "-" "]" als Beispiel und diese bei der Eval-Funktion mitinterpretiert wurden....Nunja...sehr interessant Smile
Trotzdem Vielen Dank
Private Nachricht senden Benutzer-Profile anzeigen
 
Titus
Forum-Meister

Forum-Meister


Beiträge: 871
Anmeldedatum: 19.07.07
Wohnort: Aachen
Version: ---
     Beitrag Verfasst am: 12.11.2008, 18:05     Titel:
  Antworten mit Zitat      
Hallo,

generell würde ich von solchen Variablen-Erzeugungen abraten: sie sind fehleranfällig, schwer für MATLAB zu optimieren, und der Code ist eher schwer zu lesen. Alternativ kann man eine Struktur mit dynamischen Feldnamen verwenden:
Code:

data = struct();
for i=1:nKanal
  kanalname = ... % z.B. aus Datei lesen
  data.(kanalname) = ... % Daten aus Datei lesen
end
 


Titus
Private Nachricht senden Benutzer-Profile anzeigen
 
go_progen
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 35
Anmeldedatum: 11.11.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.11.2008, 10:45     Titel:
  Antworten mit Zitat      
Danke für den Tipp!
Ich habs auf Struct umgestellt und nu läuft es wunderbar Smile
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.