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

Daten in Matrix sortieren wie in Histogramm

 

ITC_SR
Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 11.06.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.06.2013, 10:19     Titel: Daten in Matrix sortieren wie in Histogramm
  Antworten mit Zitat      
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


Dabei soll pro Bereich eine neue Matrix mit den Werten aus dem jeweiligen Bereich angelegt werden, aber leider funktioniert das ganze so nicht.

Hat jemand eine Idee wo mein Fehler liegen könnte?

LG
Sebastian
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 11.06.2013, 10:41     Titel: Re: Daten in Matrix sortieren wie in Histogramm
  Antworten mit Zitat      
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;

Soll hier wirklich ein Komma stehen? Denn dies beendet die IF-Bedinung. Vielleicht möchtest Du ein &&.

2.
Code:
sprintf('Daten_hist%03d',k)(j) = Daten_neu_sort(j);

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:
Code:
Daten_hist{k} = Daten_neu_sort(j)

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
ITC_SR
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 11.06.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.06.2013, 12:26     Titel:
  Antworten mit Zitat      
Danke für die schnelle Antwort, Jan.

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.
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 11.06.2013, 17:49     Titel:
  Antworten mit Zitat      
Hallo ITC_SR,

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.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
ITC_SR
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 11.06.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.06.2013, 13:39     Titel:
  Antworten mit Zitat      
Hallo Jan,

ups, sorry habe beim falschen Output geschaut.

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?

MfG
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 13.06.2013, 14:04     Titel:
  Antworten mit Zitat      
Hallo ITC_SR,

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.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
ITC_SR
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 11.06.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.06.2013, 14:12     Titel:
  Antworten mit Zitat      
Hallo Jan,

hier der bisherige Code
Code:
%% Einlesen der Daten
clear all
clc
close all
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²)
   
end
bin = 100; %Anzahl der Balken im Diagramm

Daten_neu_sort = sortrows(Daten_neu); %Daten nach Durchmesser sortieren

edges=0:3:300;
[n,ecken] = histc(Daten_neu_sort,edges);
Einteilvektor = zeros(length(edges),length(Daten_dia));
for i=1:length(Daten_dia)
     for j=1:length(edges)
         if ecken(i,1) == j;
            Einteilvektor(j,i)= ecken(i,1);
         else %nix
         
         end
     end
end


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.

Ist es mittlerweile klar?
LG
Private Nachricht senden Benutzer-Profile anzeigen
 
ITC_SR
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 11.06.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.06.2013, 15:56     Titel:
  Antworten mit Zitat      
Ok, hab das Problem mittlerweise gelöst, wenn auch nicht sehr elegant

Code:
%% Einlesen der Daten
clear all
clc
close all
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²)
   
end
bin = 100; %Anzahl der Balken im Diagramm

Daten_neu_sort = sortrows(Daten_neu); %Daten nach Durchmesser sortieren


[n,ecken] = histc(Daten_neu_sort,edges);
Einteilvektor = zeros(length(edges),length(Daten_dia));
for i=1:length(Daten_dia)
     for j=1:length(edges)
         if ecken(i,1) == j;
            Einteilvektor(j,i)= ecken(i,1);
         else %nix
         
         end
     end
end

for j=1:length(edges)
    count=0;
     for i=1:length(Daten_dia)
         if ecken(i,1) == j;
            count = count+1;
         else %nix
         
         end
         Lengthvektor(j,1) = count;
     end
     
end
Daten_Zelle = cell(length(edges),1);
count=Lengthvektor(1);
Daten_Zelle(1,1)=mat2cell(Daten_neu_sort(1:count,:));
for i=2:length(edges)
   
    Daten_Zelle(i,1) = mat2cell(Daten_neu_sort((count+1):(count+Lengthvektor(i)),:));
    count=count+Lengthvektor(i);
end


Danke für deine Denkanstöße, Jan!
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 13.06.2013, 17:22     Titel:
  Antworten mit Zitat      
Hallo ITC_SR,

Na dann machen wir es noch ein wenig eleganter:

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.

2.
Code:
...
Lengthvektor = zeros(length(edges), 1)
for j = 1:length(edges)
    Lengthvektor(j) = sum(ecken(:, 1) == j);
end

Aber das ist doch eigentlich wieder ein HISTC!

Die erste Doppel-Schleife sieht aus wie eine Aufgabe für ISMEMBER.

Gruß, Jan
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 - 2024 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.