Verfasst am: 21.11.2014, 16:35
Titel: Zeilen neu ordnen
Hallo,
ich hab mich schon eine Weile im Forum umgeschaut aber leider nix passendes zu mein Problem gefunden.
Ich hab ein 4x1 cell array mit jeweils immer 35025x2 Inhalt.Von diesem Inhalt jeweils ist immer die 97,3073,5761,8733,11613,14588,17463,20439,23415,26295 und 29267 Zeile an falscher Stelle.
Richtig sollte sein : Zeile 97 nach Zeile 2977, Zeile 3073 nach Zeile 5065,
5761 nach 8637, 8733 nach 11517, 11613 nach 14492, 14588 nach 17367, 17463 nach 20343, 2039 nach 23319, 23415 nach 26199, 26295 nach 29171 und 29267 nach 32051
Hätte jemand vielleicht eine Idee wie ich das Problem lösen kann?
Würde mich über jede Hilfe sehr freuen Meine Datei ist auch angehängt.
iflength(Indices_von) == length(Indices_nach) for i=1:length(Indices_von)
Daten{Indices_nach,1} == Daten{Indices_von,1};
end else % error Vektoren nicht gleich lang end
Das passt natürlich nicht zu deinem Cell array...aber ein derartiger Array findet sich auch nicht in der rawdata.mat. Dafür viele andere unnötige Variablen. Bitte eine richtiges Bsp posten und am Besten auch eine .mat Datei, in der nicht das ganze Workspace mitgespeichert wurde.
iflength(Indices_von) == length(Indices_nach) for row=1:size(Daten,1) for i=1:length(Indices_von)
Daten{row,1}(Indices_nach(i),:) = Daten{row,1}(Indices_von(i),:); % kopiere ganze Reihe bei Indices_von nach Indices_nach end end else disp('error Vektoren nicht gleich lang') end
Nach deinem Code wird aber zb. die Zeile 97 an die Stelle 2977 kopiert aber sie bleibt an der vorherigen Stelle noch erhalten, d.h ich habe im prinzip zweimal die Zeile 97. Ich will sie nicht zweimal haben sondern sie soll nach der Zeile 2977 kommen.Praktisch soll sie kopiert werden und zwischen die Zeile 2977 und 2978 eingefügt werden.
Dann musst du eben alles verschieben. Würde da so vorgehen.
Es soll z.B. aus Zeile 10 in Zeile 100 kopiert und der Vektor hat 200 Elemente.
1. kopiere Zeile 100...200 in eine andere Variable (Sicherung)
2. kopiere Zeile 10 in Zeile 100
3. lösche Zeile 10...Vektor nun von 1...99 in richtiger Reihenfolge
4. Hänge den Rest 100...200 wieder an den Vektor aus 3.
Aber im Prinzip wäre das wohl alles viel einfacher, wenn du mit den Datumsstrings arbeiten würdest, anstatt mit der Leistungswerten eines Datums. Dann würde man das Datum mittels
das Sortieren übernehmen und wandelt die datenum anschließend wieder in den Datumsstring.
Sort liefert auch den Index-array, welcher angibt wie sortiert wurde und so kannst du ganz einfach den Vektor mit den Leistungen umsortieren. Nur mal so als Anmerkung...
Also ich hab jetzt mal versucht es zu machen.Es kommt aber nicht raus wie ich des haben will und ich bekomm auch die Meldung im workspace "error Vektoren nicht gleich lang". Hier mal mein Code
iflength(Indices_von) == length(Indices_nach) for row=1:size(Daten,1) for i=1:length(Indices_von)
temp=UW_P_Q_Data{i,1}(2978:35025,:);
Daten{row,1}(Indices_nach(i),:) = Daten{row,1}(Indices_von(i),:); % kopiere ganze Reihe bei Indices_von nach Indices_nach
UW_P_Q_Data{i,1}(97,:)=[];
UW_P_Q_Data{i,1}(2978:35025,:)=temp;
end end else disp('error Vektoren nicht gleich lang') end
Ja das wäre auch eine Möglichkeit nur hab beim einlesen von den excel dateien die Spalte mit dem Datum irgendwie nicht mit eingelsen und dann hab ich nur die leistungswerte.
Ganz ehrlich...es macht nicht gerade den Eindruck also hättest du ernsthaft versucht meine Vorschläge mal selbst umzusetzen. Sonst hättest du schon beim Testen des Codes merken müssen, dass hier Data und U_P_Q_Data verwendet werden. Copy & paste lässt grüßen
Das Forum ist sicherlich nicht dazu da hier einfach nur Komplettlösungen zu posten und somit die Arbeit der Fragesteller zu übernehmen. Selbstinitiative und der Willen es verstehen und umzusetzen zu wollen sind immer willkommen.
Von Sätzen wie "ich habe keine Ahnung...kannst du mir mal ein Bsp. geben"...obwohl schon Hilfestellung gegeben wurde, kann ich langsam nicht mehr sehen.
Ich habe den folgenden Code nicht getestet, aber er macht zumindest mehr Sinn als dein Vorschlag.
Code:
Indices_von = [97,3073,...]; % Index soll kopiert und gelöscht werden
Indices_nach = [2977,...]; % nach diesem Index soll eingefügt werden
iflength(Indices_von) == length(Indices_nach) for row=1:size(Daten,1) for i=1:length(Indices_von) % Daten sichern
temp = UW_P_Q_Data{i,1}(Indices_nach(i)+1:end,:);
U_P_Q_Data{row,1}(Indices_nach(i)+1,:) = UW_P_Q_Data{row,1}(Indices_von(i),:); % kopiere ganze Reihe bei Indices_von nach Indices_nach % Element löschen
UW_P_Q_Data{row,1}(Indices_von(i),:) = [];
% Daten-Sicherung wieder anhängen
UW_P_Q_Data{row,1}(Indices_nach(i)+1:end,:) = temp;
end end else disp('error Vektoren nicht gleich lang') end
Und wenn du die Datumswerte nicht hast, warum liest du sie nicht einfach aus der Exceldatei, anstatt nun diesen Umweg zu gehen, den du offensichtlich vom Programmablauf nicht nachvollziehen kannst?
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.