clearall; clc;
daten=input('Dateiname:','s');
fid=fopen(sprintf('%s ',daten),'rt');
header=fgetl(fid); % Erst nur die Header holen
signalnamen = strread(header, '%s', 'delimiter', ' \t');
laenge=length(signalnamen);
data=textscan(fid,['%*s %*s'repmat(' %f',1,laenge) ' ']); % Datum und Zeit ignorieren, Spalten mit Zahlen holen fclose(fid);
header=regexp(header,'\t','split'); % Header an den Tabs trennen
header(cellfun(@isempty,header)) = []; % Leere Header (1. Spalte) entfernen % Create new variables in the base workspace from those fields. for i=1:length(header) assignin('base', header{i}, data{i});
end lines=numel(data{1});
tage=(lines/1440);
tag_ab=floor(tage);
for i=1:1:length(header) eval(['signal' num2str(i) ' = eval(header{i});']) end;
Matlab hat seit vielen Jahren den Type CELL um effizient Arrays verschiedener Größe und Typs in einem Container zu organisieren. Wenn Du das stattdessen Deinen Workspace mit dynamisch erzeugten Variablen blockieren möchtest, kannst Du das gerne machen. Allerdings bremst das Matlab sehr aus, weil die LIste der Variablen-Namen, die intern ja verwaltet werden muss, dauernd wächst. Ausserdem muss Matlab ja dann auch bei jedem Zugriff auf eine Variable oder Funktion länger in den Symbol-Tabellen suchen.
EVAL, ASSIGNIN, EVALIN ist also langsamer, schwerer zu debuggen und weil es unerwartet Funktionsnamen überschreiben kann führt es zu gräßlich komplizierten Debug-Parties. Wenn man das alles gerne in seinem Programm haben möchte, sollte man auf diese Befehle auf keinen Fall verzichten. Zwei EVAL-Aufrufe zu schachteln ist dann natürlich das Sahne-Häubchen.
Es ist wie in jeder Sprache: Man kann das, was man machen möchte, natürlich auf verschiede Arten ausdrücken tun. Manches tut das Ergebnis schöner und effizienter machen, aber tun kann man es tun, wie man es tun machen möchte.
Das ist kein Grund durchzudrehen, aber natürlich auch kein Grund, jemanden mit solchen Programmierstil später mal als Diplomand, Doktorand oder Programmierer anzustellen.
ich bin irgendwie so angelernt worden, dass ich möglichst immer alles haarklein definiert haben möchte, schon deswegen ist mir eval & Co suspekt. Ich denke aber, dass hier wohl noch ein zweites Semikolon fehlt: das am Ende...
Gibt es ein Ist und ein Wunsch-Soll? Gibt es Beispiele zum Durchprobieren? Wenn selbstgeschriebene Funktionen aufgerufen werden: können sie bitte angehangen werden? Gab es Fehlermeldungen?
Stimmen die Werte, wenn der Debugger mit Haltepunkten etc. eingesetzt wird?
Danke
Dabei wird die Bedingung innerhalb von CELLFUN getestet, statt für jedes einzelne CELL-Element die Funktion ISEMPTY aufzurufen.
Weitere Befehle mit dieser Warp-Geschwindigkeit in CELLFUN:
isreal, islogical, length, ndims, prodofsize (heutzutage heisst das NUMEL...), size, isclass.
Was spräche denn dagen, "signal" als struct per Output zurückzugeben und die "header{i}" als Feldnamen zu verwenden?
Das wäre allemal sicherer und sogar effizienter. Man könnte die Funktion dann auch problemlos nochmal als Unterfunktion für andere Programme verwenden.
Gruß, Jan
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.