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?
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
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?
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?
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:
clearall;
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
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
Trotzdem Vielen Dank
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
Danke für den Tipp!
Ich habs auf Struct umgestellt und nu läuft es wunderbar
Einstellungen und Berechtigungen
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
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.