Verfasst am: 11.06.2013, 10:19
Titel: Daten in Matrix sortieren wie in Histogramm
Halle goMatlab Community,
ich habe folgende Problem. Ich habe eine Datenschar, die aus einem Durchmesser, einer Zeit, 2 Geschwindigkeiten und einer errechneten Größe besteht. Diese sind durch sortrow schon nach dem Durchmesser sortiert.
Nun will ich die Daten in Durchmesser-Bereiche einteilen (0-3,3-6,6-9 etc.) wie in einem Histogramm eben, aber ich will die restlichen Zeilen ebenfalls mitnehmen, das kann der Befehl hist meines Wissens ja nicht.
Habe mir eine for-Schleife überlegt mit Bedingungen
Code:
Anfang = 0; %Beginn der Einordnung bei 0 µm
Intervallbreite = 3; %Breite der Intervalle
Ende = Anfang + Intervallbreite; %Startwert des ersten Intervallendes
Daten_neu_sort = sortrows(Daten_neu); %Daten nach Durchmesser sortieren
for j=1:length(Daten_dia)
k=1;
if Daten_neu_sort(j,1) >= Anfang ,Daten_neu_sort(j,1) < Ende;
sprintf('Daten_hist%03d',k)(j) = Daten_neu_sort(j);
else %nix
end
k=k+1;
Anfang=Anfang+Intervallbreite;
Ende=Ende+Intervallbreite;
end
Verfasst am: 11.06.2013, 10:41
Titel: Re: Daten in Matrix sortieren wie in Histogramm
Hallo ITC_SR,
Lies nochmal die Dokumentation zu HISTC durch: Der zweite Output hilft weiter.
Es gibt aber noch ein grundlegendes Problem in Deinem Code: Du schreibst zwar "funktioniert nicht", eine genaue Erklärung ist aber für eine Diskussion im Forum immer erforderlich.
Hier kann man aber schon zwei Probleme erahnen:
1.
Code:
if Daten_neu_sort(j,1) >= Anfang ,Daten_neu_sort(j,1) < Ende;
Das kann nicht funktionieren: Auf der linken Seite steht ein String. Du meinst wahrscheinlich die Variable, deren Name dieser String ist, aber das ist eine ganz andere Sache. Es ist wichtig, dass dies klar wird.
Statt einen Index im Namen der Variablen zu verstecken, ist ein Index naheliegend und effizient:
Ja, das HISTC kenn ich, nur bringt mir das wenig, da es nur eine Spalte sortiert, für meine Aufgabenstellung muss ich aber eine Matrix mit 5 Spalten nach einer Spalte in die Bereich sortieren und die restlichen 4 Spalten mitnehmen, deshalb der Versuch mit der Schleife. Diese funktioniert prinzipiell auch ganz gut, nur das sie leider immer nur den selben Wert in jede Spalte schreibt, und auch nur eine Zeile beschreibt. Es sind aber pro Spalte(Die ein Durchmesserbereich sein soll) mehere 10 oder hundert Einträge.
Code:
for j=1:length(Daten_dia) for k=1:bin;
if Daten_neu_sort(j,1) >= Anfang && Daten_neu_sort(j,1) < Ende;
Daten_hist{k} = Daten_neu_sort(j,:);
else %nix
end
k=k+1;
end
Anfang=Anfang+Intervallbreite;
Ende=Ende+Intervallbreite;
end
So schreibt er mir leider immer nur in die erste Zeile und immer dieselbe Information. Ich denke das meine Schleifenlogik noch falsch ist, es soll für jedes Datenpaket geschaut werden, ob es im zu prüfenden Bereich liegt, und wenn ja, in eine Spalte der Daten_hist Matrix geschrieben werden, die spaltenweise mit den Bereichen wachsen soll.
Hast Du Dir wie vorgeschlagen die Hilfe-Texte zu HISTC nochmal durchgelesen? Der zweite Output gibt die Indices zurück, mit denen sich auch die anderen Spalten entsprechend sortieren lassen.
Der jetztige Code überschreibt Daten_hist{k} immer wieder. Das ist wahrscheinlich nicht gewünscht. k ausserhalb der Schleife hochzuzählen bringt nichts, da es in der nächsten Schleife wieder bei 1 beginnt.
Habe jetzt einen Vektor, der die Anzahl an Datenpunkten pro Bereich angibt, wie kann ich jetzt die Matrix mit diesen Daten dynamisch ordnen, gibt es dazu einen Befehl, die Indixes der Spalten dynamisch laufen zu lassen?
Bitte poste konkrete Daten oder ein Minimal-Beispiel, dass Deine vorliegenden Werte produziert. Ich kann mir zur Zeit noch nicht genau vorstellen, welche Daten Du in welcher Form vorliegen hast und was "dynamisch laufen" genau bedeutet.
%% Einlesen der Daten clearall clc closeall
fileID = fopen('test.txt','r'); %Namen des Files einlesen, WICHTIG: Leider...
%kann das Programm nur die Daten einlesen, der Header muss weg.
heading = textscan(fileID,'%n %n %n %n %n %n %n %n',1); %Einlesen der Daten
fgetl(fileID); % advance the file pointer one line
Daten = textscan(fileID,'%n %n %n %n %n %n %n %n');
Daten_dia = cell2mat(Daten(:,8)); % Durchmesser der gemessenen Tropfen µm
Daten_Time = cell2mat(Daten(:,3)); % Transittime der Messergebnisse µs
Daten_geschw_u =cell2mat(Daten(:,4)); % Horizontale Geschwindigkeit m/s
Daten_geschw_v =cell2mat(Daten(:,5));% Vertikale Geschwindikeit m/s
burst_length = zeros(length(Daten_dia),1);
Daten_neu = [Daten_dia,Daten_Time,Daten_geschw_u,Daten_geschw_v,burst_length]; %Matrix mit den erforderlichen Daten
%% Berechnungen
%Burst Length berechnen
for i=1:length(Daten_dia)
Daten_neu(i,5)=Daten_neu(i,2)*1E-6*sqrt(Daten_neu(i,3)^2+Daten_neu(i,4)^2);
%Berechnung Burst lenght nach L=Delta_t*Wurzel(u²+v²)
Nun hab ich die Länge der einzelnen Bereiche in den Einteilvektor geschrieben.
Nun will ich einen CellArray, der die Datenmatrix mit den Bereichen (i:i+1,:)(wobei i und i+1 den Eckdaten des histogramms entspricht) in jeweils eine Zelle schreibt, damit ich später mit den Einzelnen Bereichen rechnen kann. Nun will ich eine Schleife oÄ., welche mir erlaubt, die Daten_neu_sort Matrix in einen Cellarray-Vektor umzuschreiben, in der wiefolgt aussieht
Cellarray = { Daten_neu_sort(1:506,:);
Daten_neu_sort(507:n,:);
Daten_neu_sort(n+1:m,:);
Daten_neu_sort(m+1:o,:);
etc. }
Damit hätte ich alle Daten manuell in eine Histogrammähnliche Weise verpackt.
Ok, hab das Problem mittlerweise gelöst, wenn auch nicht sehr elegant
Code:
%% Einlesen der Daten clearall clc closeall
fileID = fopen('test.txt','r'); %Namen des Files einlesen, WICHTIG: Leider...
%kann das Programm nur die Daten einlesen, der Header muss weg.
heading = textscan(fileID,'%n %n %n %n %n %n %n %n',1); %Einlesen der Daten
fgetl(fileID); % advance the file pointer one line
Daten = textscan(fileID,'%n %n %n %n %n %n %n %n');
Daten_dia = cell2mat(Daten(:,8)); % Durchmesser der gemessenen Tropfen µm
Daten_Time = cell2mat(Daten(:,3)); % Transittime der Messergebnisse µs
Daten_geschw_u =cell2mat(Daten(:,4)); % Horizontale Geschwindigkeit m/s
Daten_geschw_v =cell2mat(Daten(:,5));% Vertikale Geschwindikeit m/s
burst_length = zeros(length(Daten_dia),1);
Daten_neu = [Daten_dia,Daten_Time,Daten_geschw_u,Daten_geschw_v,burst_length]; %Matrix mit den erforderlichen Daten
%% Eingabe Benutzer
edges=0:3:300; % Start und Endwert der Durchmesserbereiche
%% Berechnungen
%Burst Length berechnen
for i=1:length(Daten_dia)
Daten_neu(i,5)=Daten_neu(i,2)*1E-6*sqrt(Daten_neu(i,3)^2+Daten_neu(i,4)^2);
%Berechnung Burst lenght nach L=Delta_t*Wurzel(u²+v²)
1. Das "clear all" würde ich unbedingt weglassen. Wenn Du wissen möchtest weshalb, kannst Du ja einige andere Antworten durchlesen, die ich heute dazu gegeben habe.
Die erste Doppel-Schleife sieht aus wie eine Aufgabe für ISMEMBER.
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.