Verfasst am: 09.10.2010, 02:12
Titel: string array holen und als datei name benutzen
Hallo,
ich hab eine schleife in meinem GUI-M-File wo ich einen bestimmten Anzahl von Dateien speichern muss . Ich möchte nun diese Dateien (mit einem Edit Box) bennen bzw. einen Namen geben befor die gespeichert werden.
die schleife sieht so aus ,
Code:
data = get(ai,'UserData');
if(data.curtrigger <= data.maxtriggers) if(data.curtrigger == data.maxtriggers) for i=1:data.maxtriggers
c = getdata(ai);
Die funktion wo das Speichern läuft hat kein Handles im Header wobei die ganze variabeln werden von 'UserData' geholt.
Die innere Schleife wird nur durchgefürt wenn die Taste 'Daten speichern' gedrückt wird und einen Anzahl von Dateien größer als 0 gegeben wird.
if(data.curtrigger == data.maxtriggers) for i=1:data.maxtriggers
c = getdata(ai);
c = c(data.delay:data.samples,:);
data.c{data.curtrigger} = c ;
disp(i) save(('Messung %d .mat',i),'c');
stop(ai);
start(ai);
end end
data.curtrigger = data.curtrigger + 1;
Die funktion wo das Speichern läuft hat kein Handles im Header
verstehe ich nicht? Wo gibst du denn deinen Namen für die Datein ein? Hasst du eine Edit Box erstellt, so hat diese auch ein handle (siehe die beiden Beispiele aus meinem letzten Post).
Wie würdest du denn gern den Dateinamen haben. Gib doch mal ein Beispiel, derzeit scheint es ja laut dieser Zeile
Code:
save(sprintf('Messung %d.mat',i),'c'); % Hier werden die MAT dateien nummeriert
Messung1.....Messung2...Messungx zu sein? Möchtest du dies?
Zudem bist du auch nicht auf meine Lösungen eingegangen: Haben Sie nicht funktioniert, entsprachen sie nicht deinen Erwartungen, und wie schon gesagt was sind deine Erwartungen. Zudem ist dein zusätzlicher Code mit den ganzen data.feld Angaben doch dafür völlig unrelevant für die Benennung der Daten oder? Was sind die zusätzlichen Informationen die ich daraus schließen sollte?
Ja allerdings, ich die ganzen data.felder sind irrelevant für was ich machen will.
also die daten so wie es in der Schliefe steht werden doch in Dateien gespeichert: Messung 1, Messung 2 etc etc..
Ich möchte nur noch einen String von einem Edit Text,der was auf dem Titel der Datein dazu legt. Zum Beispiel wenn der User in dem Edit Text schreibt (Blabla) dann werden die Daten so umbenennt : blabla Messung 1, blabla Messung 2, usw.
Die erste Idee war für mich auch den handles.edittext zu holen, aber wenn das Programm in die Function triggerendcallback steht hat er schon vorher die handles gelöscht.
wie gesagt das ganze läuft non stop und wird immer wieder getriggert.
wenn du magst kann ich dir das ganze file schicken.
Ich bin so der MATLAB Programmierer aber ich lerne gern was neues.
du musst die handles natürlich der function triggerendcallback übergeben. Ich habe mal ein Minimalbeispiel gebastelt, wo du in einem edit Feld den Dateinamen angibst und nach dem Drücken des Buttons deine Daten speichern kannst:
Code:
function test
h = uicontrol('style','edit','Units','normalized','Position',[.5 .5 .1 .1]);
uicontrol('style','pushbutton','Units','normalized','Position',[.5 .35 .1 .1],'String','Save Data',...
'callback',{@triggerendcallback,h}); % callback mit Übergabe des handles h end
Sco vielen vielen dank.
das ist genau was ich brauche, aber da ich die ganzen gadgets und auch edit text mit GUIDE erstellt hab, weiss ich nicht wie ich dein Beispiel in meinem implementieren kann.
kannst du mit bitte das auch zeigen? mit uicontrols kenn ich mich noch nicht aus.
Die funktion wo das Speichern läuft hat kein Handles im Header
Wenn du es mit GUIDE programmiert hasst, MUSST du eine handles Struktur haben, da Matlab diese automatisch erzeugt! Also muss folgender Befehl funktionieren:
Code:
name = get(handles.edit1,'String'); % Edit Box Tag ist 'edit1'
Egal in welchen Callback du bist, die handles Strktur (enthält die Objekte deiner Oberfläsche) ist immer verfügbar. D.h. der Code deines Buttons 'Daten Speichern' muss so aussehen:
Code:
% --- Executes on button press in pushbutton1. function pushbutton1_Callback(hObject, eventdata, handles) % hObject handle to pushbutton1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
name = get(handles.edit1,'String');
c = rand(10); % deine Variablen save(sprintf('%s_Messung %d.mat',name,1),'c');
die c sind die erneuerten samples nach jeden Trigger, deshalb steht die in triggerendcallback schleife, um in jeden erzeugten Datei neue Samples zu speichern.
bedeutet inhalt von c wird 'i' mal in txt Datein gespeichert und nmmeriert.
Danke Sco. Es hat doch geklappt allerdings sollte ich doch was in data.felder zufügen.
Deine Angaben waren doch hifreich, ich weiss das mein Code sehr Chaotisch aussieht, aber ich muss damit umgehen
Ich hätte noch eine bitte, (soll ich einen neuen Thread öffnen? )
beim Clicken aufm Store button soll ein Fenster aufgehen um den Pfad auszuwählen wo die ganzen Files gespeichert werden sollen..
das problem nun ist die Übertragung von Datien von da wo die gespeichert sind zum Workspace. Die Menge von diesen Dateien soll in großer Anzahl generiert werden. und um die zum Workspace zu holen muss ich jeden Datei eizeln mit rechte Maustaste--> Import Data---> Bestätigen..
als scv kann ich die dateien zum Workspace rüber ziehen mit dem richtigen Namen, aber mit SAVE nehmen die Dateien in Workspace nur die Name C obwohl sie nach nummern im Speicherort gespeichert sind. d.h. wenn ich die zweite Datei rüber ziehe wird der erste c überschrieben. Ich versteh auch nicht warum das passiert.
für Load function, soll ich die auch in die Schleife schreiben ? oder soll die extra im Command Window gegeben werden ??
Das c überschrieben wird ist doch klar, da dein mat-File (Verschiedene Namen) eben nur eine Variable Namens 'c' enthält! Wenn du dies vermeiden möchtest, dann solltest du anstatt immer c in eine mat File zu speichern, c1, c2... oder so speichern. Verwende dafür folgenden Code (prinzipiell):
Code:
for k = 1:10% deine Schleife
c = rand(10); % deine Variablen eval(['c' num2str(k) '= c;']); % erzeugt c1...c2...cx als Variablenname, so dass es beim Import nicht überschrieben wird end
Wegen dem load: Nur um nochmal sicherzugehen, dass ich verstanden habe was du machst, bzw. machen möchtest. Du speicherst mehrere Mat-Files, denen du zuvor einen Namen gegeben hasst. Nun möchtest du Sie wieder alle einladen?
Wo machst du das--> in deinem Programm? (das würde wenig Sinn machen, warum dann zuvor erst als mat-File speichern), oder danach in einem anderem Programm?
Also was hasst du mit den mat-Files vor?
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.