WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Zeilen neu ordnen

 

Mensch61
Forum-Anfänger

Forum-Anfänger


Beiträge: 46
Anmeldedatum: 13.11.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.11.2014, 16:35     Titel: Zeilen neu ordnen
  Antworten mit Zitat      
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 Smile Meine Datei ist auch angehängt.

Vielen Dank im Voraus

tst.rar
 Beschreibung:

Download
 Dateiname:  tst.rar
 Dateigröße:  1.8 MB
 Heruntergeladen:  276 mal
Private Nachricht senden Benutzer-Profile anzeigen


DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 21.11.2014, 18:26     Titel: Re: Zeilen neu ordnen
  Antworten mit Zitat      
Mensch61 hat Folgendes geschrieben:

Hätte jemand vielleicht eine Idee wie ich das Problem lösen kann?


Ja...mit einer for Schleife, in der Schritt für Schritt die Indices abgearbeitet werden!

Code:

Indices_von = [97,3073,...];
Indices_nach = [2977,...];

if length(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.

Siehe Doku zu save!
Private Nachricht senden Benutzer-Profile anzeigen
 
Mensch61
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 46
Anmeldedatum: 13.11.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.11.2014, 18:43     Titel:
  Antworten mit Zitat      
srry für den ganzen workspace.

mein cell array sieht natürlich so aus

neu.rar
 Beschreibung:

Download
 Dateiname:  neu.rar
 Dateigröße:  320.05 KB
 Heruntergeladen:  259 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 21.11.2014, 19:30     Titel:
  Antworten mit Zitat      
Das wäre eine Möglichkeit:

Code:

Indices_von = [97,3073,...];
Indices_nach = [2977,...];
Daten = {...};

if length(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
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Mensch61
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 46
Anmeldedatum: 13.11.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.11.2014, 20:16     Titel:
  Antworten mit Zitat      
Dein Code funktioniert einwandfrei vielen Dank.

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.
Private Nachricht senden Benutzer-Profile anzeigen
 
Mensch61
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 46
Anmeldedatum: 13.11.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.11.2014, 20:22     Titel:
  Antworten mit Zitat      
Vielleicht nochmal zum Verständis.Die Daten sind Leistungen von jeweils einem Jahr geordnet von Januar bis Dezember.

Die Zeile 96 entspricht dem 01.01.2013, die Zeile 97 01.02.2013
und die Zeile 98 02.01.2013.Wie man schon sieht ist die Zeile 97 am falschen Platz.

Deshalb will ich sie an die Stelle nach 2977 haben weil die Zeile 2977 entspricht dem 31.01.2013.
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 21.11.2014, 20:25     Titel:
  Antworten mit Zitat      
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.
Private Nachricht senden Benutzer-Profile anzeigen
 
Mensch61
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 46
Anmeldedatum: 13.11.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.11.2014, 20:33     Titel:
  Antworten mit Zitat      
Könntest du bitte ein beispielcode posten habs des jetzt nicht so richtig verstanden
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 21.11.2014, 20:41     Titel:
  Antworten mit Zitat      
Code:
Daten = rand(200,2);

% 1.
temp = Daten(100:200,:);
% 2.
Daten(100,:) = Daten(10,:);
% 3.
Daten(10,:) = [];
% 4.
Daten(100:200,:) = temp;
Private Nachricht senden Benutzer-Profile anzeigen
 
Mensch61
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 46
Anmeldedatum: 13.11.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.11.2014, 22:14     Titel:
  Antworten mit Zitat      
Angewendet auf meine Datei hab ich jetzt für eine Zeile zb

Code:
temp=UW_P_Q_Data{1,1}(2978:35025,:);
UW_P_Q_Data{1,1}(2978,:)=UW_P_Q_Data{1,1}(97,:);
UW_P_Q_Data{1,1}(97,:)=[];
UW_P_Q_Data{1,1}(2978:35025,:)=temp;



Meine Frage jetzt.Kann ich das jetzt irgendwie automatisieren sodass ich des für alle 11 Zeilen gleichzeitig machen kann?
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 22.11.2014, 00:56     Titel:
  Antworten mit Zitat      
Du musst einfach nur den code mit den for Schleifen mit diesem hier verbinden und dabei Indices_vor und _nach an die richtige Stelle setzen.

Du kannst hier auch schreiben:
Code:
UW_P_Q_Data{1,1}(2978:end,:);


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
Code:
umwandeln, lässt Matlab mit
Code:
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...
Private Nachricht senden Benutzer-Profile anzeigen
 
Mensch61
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 46
Anmeldedatum: 13.11.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.11.2014, 21:56     Titel:
  Antworten mit Zitat      
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

Code:
Indices_von = [97,3073,...];
Indices_nach = [2977,...];


if length(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.
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 23.11.2014, 22:51     Titel:
  Antworten mit Zitat      
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 Wink

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


if length(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?
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.