Verfasst am: 03.02.2016, 18:40
Titel: Nach welchem Schema soritert Matlab ein Cell-Array
Servus Leute,
habe ein kleines Verständnisproblem.
Im folgenden Code wird überprüft ob ein Datensatz schon exisitert oder nicht.
Falls dieser Datensatz nicht existiert, wird der User aufgefordert durch das Auswählen von Daten dies zu tun.
Falls dieses Skript ein zweites mal durchlaufen werden soll, kann der User vorher angeben ob der Datensatz existiert oder nicht. Da wir jetzt ein Datensatz haben wird dieser dann geladen und dann zugewiesen.
Mir ist aber aufgefallen das die Reihenfolge sich ändert. Folgend werden beide Varianten aufgelistet, dabei verwende ich die Variablennamen die dazu verwendet worden sind diese in ein struct zu speichern und dann mittels struct2cell umgewandelt werden.
Dabei irritiert mich das es nur die ersten 3 betrifft und nicht alle.
Und warum wird die Sortierung nicht so beibehalten wie ich sie mittels uisave angegeben habe ?
Ich danke euch im Voraus.
Code:
if TDVorhanden == 0 %Nicht vorhanden-->Neue Tabellendatei wird erstellt.
%%
%**********************************************************************
%Load data for the Simulink Temp.-Model%
%User-Interface for Speed-Data
[SpeedName, SpeedPath] = uigetfile('*.mat',...
'Please choose MAT-File for Speed');
ifisequal(SpeedName,0) || isequal(SpeedPath,0) disp('User selected Cancel') else disp(['For Speed-Data User selected ',fullfile(SpeedPath,...
SpeedName)]) end
SpeedRowBP2 = fullfile(SpeedPath,SpeedName);
SpeedRowBP2 = load(SpeedRowBP2);
SpeedRowBP2 = struct2cell(SpeedRowBP2);
SpeedRowBP2 = SpeedRowBP2{1,1};
%%
%User-Interface for Pvrotor 1st Calculation
[WrotName1, WrotPath1] = uigetfile('*.mat',...
'Please choose MAT-File for first Wrotor');
ifisequal(WrotName1,0) || isequal(WrotPath1,0) disp('User selected Cancel') else disp(['For first Wrot-Data User selected ',fullfile(WrotPath1,...
WrotName1)]) end
WrotTD1 = fullfile(WrotPath1,WrotName1);
WrotTD1 = load(WrotTD1);
WrotTD1 = struct2cell(WrotTD1);
WrotTD1 = WrotTD1{1,1};
%User-Interface for Pvstator 1st Calculation
[WstatName1, WstatPath1] = uigetfile('*.mat',...
'Please choose MAT-File for first Wstator');
ifisequal(WstatName1,0) || isequal(WstatPath1,0) disp('User selected Cancel') else disp(['For first Wstat-Data User selected ',fullfile(WstatPath1,...
WstatName1)]) end
WstatTD1 = fullfile(WstatPath1,WstatName1);
WstatTD1 = load(WstatTD1);
WstatTD1 = struct2cell(WstatTD1);
WstatTD1 = WstatTD1{1,1};
%%
%User-Interface for Pvrotor 2nd Calculation
[WrotName2, WrotPath2] = uigetfile('*.mat',...
'Please choose MAT-File for second Wrotor');
ifisequal(WrotName2,0) || isequal(WrotPath2,0) disp('User selected Cancel') else disp(['For second Wrot-Data User selected ',fullfile(WrotPath2,...
WrotName2)]) end
WrotTD2 = fullfile(WrotPath2,WrotName2);
WrotTD2 = load(WrotTD2);
WrotTD2 = struct2cell(WrotTD2);
WrotTD2 = WrotTD2{1,1};
%User-Interface for Pvstator 2nd Calculation
[WstatName2, WstatPath2] = uigetfile('*.mat',...
'Please choose MAT-File for second Wstator');
ifisequal(WstatName2,0) || isequal(WstatPath2,0) disp('User selected Cancel') else disp(['For second Wstat-Data User selected ',fullfile(WstatPath2,...
WstatName2)]) end
WstatTD2 = fullfile(WstatPath2,WstatName2);
WstatTD2 = load(WstatTD2);
WstatTD2 = struct2cell(WstatTD2);
WstatTD2 = WstatTD2{1,1};
%%
%User-Interface for Pvrotor 3rd Calculation
[WrotName3, WrotPath3] = uigetfile('*.mat',...
'Please choose MAT-File for third Wrotor');
ifisequal(WrotName3,0) || isequal(WrotPath3,0) disp('User selected Cancel') else disp(['For third Wrot-Data User selected ',fullfile(WrotPath3,...
WrotName3)]) end
WrotTD3 = fullfile(WrotPath3,WrotName3);
WrotTD3 = load(WrotTD3);
WrotTD3 = struct2cell(WrotTD3);
WrotTD3 = WrotTD3{1,1};
%User-Interface for Pvstator 3rd Calculation
[WstatName3, WstatPath3] = uigetfile('*.mat',...
'Please choose MAT-File for third Wstator');
ifisequal(WstatName3,0) || isequal(WstatPath3,0) disp('User selected Cancel') else disp(['For third Wstat-Data User selected ',fullfile(WstatPath3,...
WstatName3)]) end
WstatTD3 = fullfile(WstatPath3,WstatName3);
WstatTD3 = load(WstatTD3);
WstatTD3 = struct2cell(WstatTD3);
WstatTD3 = WstatTD3{1,1};
%Zum Speichern der Daten, um diese wiederverwenden zu koennen!!
uisave({'TorqueColBP1','SpeedRowBP2','WrotTD1','WrotTD2','WrotTD3',...
'WstatTD1','WstatTD2','WstatTD3','Theta_st','Theta_rot'},'Tabellendaten_');
disp('Files are ready for Simulink');
else %Tabellendatei ist vorhanden --> Alle Variablen werden geladen.
disp('Bitte laden Sie die vorhandenen Daten in das Workspace');
[TDName, TDPfad] = uigetfile('*.mat',...
'Bitte waehlen Sie die vorhandenen Tabellendaten');
ifisequal(TDName,0) || isequal(TDPfad,0) disp('User selected Cancel') else disp(['Laden der Tabellendaten erfolgreich:',fullfile(TDPfad,...
TDName)]) end
Tabellendaten = fullfile(TDPfad,TDName);
Tabellendaten = load(Tabellendaten);
Tabellendaten = struct2cell(Tabellendaten);
Theta_st = Tabellendaten{1,1};
Theta_rot = Tabellendaten{2,1};
SpeedRowBP2 = Tabellendaten{3,1};
TorqueColBP1 = Tabellendaten{4,1};
WrotTD1 = Tabellendaten{5,1};
WrotTD2 = Tabellendaten{6,1};
WrotTD3 = Tabellendaten{7,1};
WstatTD1 = Tabellendaten{8,1};
WstatTD2 = Tabellendaten{9,1};
WstatTD3 = Tabellendaten{10,1};
disp('Daten erfolgreich geladen');
end
bitte reduziere deinen Code doch mal auf das Wesentliche und vor allem als ein lauffähiges Bsp. bei dem der Fehler reproduzierbar ist.
Wenn ich dich richtig verstanden habe, geht es eigentlich nur um die
uisave
Zeile, das laden des *.mat files und danach das Zuordnen der gespeicherten Daten zu den einzelnen Variablen.
Bei diesem simplen Bsp. stimmt die Reihenfolge immer:
mal abgesehen von dem vollkommen richtigen Einwand Winkows, kann es sein das du evtl. die Reihhenfolge der einzelnen Variablen im Workspace meinst? Diese ist alphabetisch sortiert und daher anders als die save Reihenfolge.
Wenn ich mir sowohl die Reihenfolge im struct Tabellendaten als auch dessen Umwandlung in cell ansehe, entspricht die Reihenfolge immer der von uisave.
Weil ich die einzelnen Variablen im Workspace brauche da ich diese für ein Simulink-Modell benötige.
Nein ich meine schon die Reihenfolge in 'Tabellendaten'. Wie gesagt selbst wenn ich deinen veränderten Code verwende werden diese nicht nach dieser Reihenfolge gespeichert. Ich kenne es normalerweise auch so wie du es beschreibst.
Deswegen auch dieser Beitrag. Ich verstehe einfach nicht warum sich das ändert.... Es ändert sich ja nicht nur nach einer Variante sondern nach den oben angegebenen.
Mache ich das an meinem Rechner ist es Variante 1 mache ich es auf den Firmenrechner ist es Variante 2.
Edit:
Was mir gerade auffällt im Struct wird ja auch nach Namen sortiert. Ich frage mich nur Warum er bei dir nach der Reihenfolge von uisave das speichert und bei mir nicht.
Zuletzt bearbeitet von JaSoIstEs am 04.02.2016, 19:40, insgesamt einmal bearbeitet
uisave({'TorqueColBP1','SpeedRowBP2','WrotTD1','WrotTD2','WrotTD3',...
'WstatTD1','WstatTD2','WstatTD3','Theta_st','Theta_rot'},'Tabellendaten_');
clear disp('Bitte laden Sie die vorhandenen Daten in das Workspace');
[TDName, TDPfad] = uigetfile('*.mat',...
'Bitte waehlen Sie die vorhandenen Tabellendaten');
ifisequal(TDName,0) || isequal(TDPfad,0) disp('User selected Cancel') else disp(['Laden der Tabellendaten erfolgreich:',fullfile(TDPfad,...
TDName)]) end
Tabellendaten = fullfile(TDPfad,TDName);
load(Tabellendaten);
So erst einmal Danke für den Hinweis. Hätte es auch gleich wie folgt mit dem struct machen können. Habe mal wieder zu kompliziert gedacht. Ist auch viel einfacher und ich bin nicht von der Sortierung Matlabs abhängig.
Trotzdem würde es mich interessieren warum Matlab es bei mir nicht nach der uisave Reihenfolge belässt.
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.