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

Matrix über Spalten und Reihen diskretisieren

 

Heji
Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 17.01.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.01.2020, 08:47     Titel: Matrix über Spalten und Reihen diskretisieren
  Antworten mit Zitat      
Guten Morgen,

Ich habe ein Problem bei meiner Datenauswertung. Ich erkläre es an einem einfachen Beispiel. Von 5 Körpern wird über zwei Zeitschritte die Position in einem zylindrischen Raum aufgezeichnet.
Es liegt eine 10x3 Matrix vor, bei der in ersten Spalte die ID von meinen 5 Messkörpern steht, in Spalte 2 die radiale Position und in der 3. Spalte die Höhe.
X = [1 2 3 4 5 1 2 3 4 5; 1 2 1 3 5 4 2 5 3 2; 6 3 6 3 5 2 6 1 1 3]'

Ich möchte nun gerne die Aufenthaltswahrscheinlichkeit im 2D Raum erfassen. Das heißt, ich möchte für eine beliebige radiale Position und Höhe wissen können, wie viele Körper sich dort aufgehalten haben (oder auch nicht).
Also sowas wie:

1 0 2 0 0

0 3 0 0 1

2 0 0 1 0

0 3 0 0 2

0 3 0 0 1

2 0 0 1 0

Wobei die Zeilenanzahl die Intervalle der Höhe sind (0-1, 1-2,2-3 usw.) und die Spalten die Intervalle der radialen Position (0-1, 1-2…). Die Einträge entsprechen der Anzahl der sich an der jeweiligen Poistion aufgehaltenen Körper über die zwei Zeitschritte.

Ich hatte mehrere Ansätze bin aber leider auf keine Lösung gekommen.
In nur eine Richtung bekomme ich hin, sprich die Anzahl an Körpern für zum Beispiel bestimmte radiale Positionen. Ich scheitere jedoch an der Verknüpfung von beiden.
1. Idee:
Code:
Startradius = 0;
Radgrid = 1; % Diskretisierungsschritt
Endradius = 5;
 
rad_anzahl = zeros(length(Startradius:Radgrid:Endradius),1);
i=1;
 
for r = Startradius:Radgrid:Endradius
       
    rad_anzahl(i) = length(find(X(:,2) >= r & X(:,2) < r+Radgrid)); %Berechnet die Anzahl pro Intervall des Radius
    i=i+1;
   
   
end
 


Nun habe ich natürlich meine Information über meine Höhe verloren. Ich weiß nun nur, wie viele Körper sich über die zwei Zeitschritte in dem jeweiligen Intervall der radialen Position befunden haben, jedoch nicht bei welcher Höhe diese waren.

Ich hatte also die Idee, mir die Höhe der Körper für bestimmte Intervalle der radialen Position rauszuschreiben. Ich komme jedoch nicht weiter als mit einer cell, in der ich die Indexe für die Einträge meiner jeweiligen radialen Positionen habe. Weiß ich die Indexe, müsste ich eigentlich eine neue Matrix schreiben können, in der ich meine jeweilige Höhe habe. Ich komme aber nicht weiter als meine cell mit den Indexen in eine Matrix umzuschreiben. Ob mir das alles wirklich hilft…
Code:
i=1;
for z = 1:1:5
   
   a(i,:)={find(X(:,1)>=z & X(:,1)<z+1)}';
 
    i=i+1;
 
end
 
clear z
 
 
lmax=max(cellfun(@length,a));
ncol=cellfun(@length,a);
m=zeros(numel(a),lmax);
%Zeilen werden erst mit Zahlen aufgefüllt und dann die Nullen angehängt
for k=1:numel(ncol)
    m (k,1:ncol(k))=a{k}; % vorn einfügen
   
end
 
 


Vielleicht könnte ich es auch direkt über zwei miteinander verschachtelte for Schleifen hinbekommen, in denen ich erst die radiale Position durchzusuche und dann im Anschluss die Höhe für die jeweilige radiale Position.

Ich hoffe ich konnte einigermaßen rüberbringen, was mein Problem ist und was ich gerne hätte. Momentan hänge ich einfach und weiß nicht weiter. Vielleicht kann mir hier jemand helfen, ich wäre euch wirklich sehr, sehr dankbar!
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 18.01.2020, 10:25     Titel:
  Antworten mit Zitat      
Hallo,

die erste Spalte der Daten ist also nicht weiter relevant?

Meines Erachtens kann man histcount2 dafür verwenden.
Code:
histcounts2(X(:,2), X(:,3), 'BinMethod','integers')


Da kommen andere Ergebnisse heraus als du angibst, ich sehe aber auch einfach nicht, wie du auf deine Ergebnisse kommst.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Heji
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 17.01.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.01.2020, 10:45     Titel:
  Antworten mit Zitat      
Hallo,

Genau die erste Spalte ist nicht relevant, es sollte nur zeigen, dass natürlich zu jedem Körper die radiale Position sowie seine Höhe "zusammen gehören".

Meine geschriebene Matrix war rein zufällig von mir ausgefüllt, es sind keine Ergebnisse. Entschuldigung für die Verwirrung, es sollte nur bildlich darstellen, was ich am Ende gerne für einen Aufbau der Matrix mit den jeweiligen berechneten Werten hätte. Also in meinen Spalten von links nach rechts ist aufsteigend die radiale Position in Intervallen geschrieben, in meinen Zeilen absteigend (oder aufsteigend, prinzipiell egal) die Höhe geschrieben.
Vielleicht beschreibe ich es am besten nochmal bildlich: Ich habe einen 2D Raum in dem irgendwo Punkte liegen. Nun möchte ich eigentlich ein "Gitternetz mit einer bestimmten Netzweite" darüber legen um die Anzahl der Punkte in bestimmten Gitterzellen zu wissen. Das erlaubt mit dann später Rückschlüsse, in welchen Gebieten meine Wahrscheinlichkeit hoch ist, einen Körper zu treffen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 18.01.2020, 10:50     Titel:
  Antworten mit Zitat      
Hallo,

und? Hast du nun versucht, ob der Vorschlag das macht, was du möchtest?

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Heji
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 17.01.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.01.2020, 11:07     Titel:
  Antworten mit Zitat      
Leider nicht. Ich bekomme eine 5x14 Matrix raus:
0 0 0 0 0 0 0 1 0 0 1 0 0 0
0 0 1 0 0 1 0 0 0 1 0 0 0 0
0 0 1 0 0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 1
1 0 0 0 0 0 0 0 1 0 0 0 0 0

Bei meinen realen Messwerten kann ich nicht in ganzzahligen Schritten meine Intervall Breite setzen, sondern muss zum Beispiel in 0.002 Schritten durch meine Messdaten laufen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 18.01.2020, 12:04     Titel:
  Antworten mit Zitat      
Hallo,

dann musst du die Optionen von histcounts2 entsprechend anpassen. Du kannst ja die Edges in x- und y-Richtung vorgeben.

Bitte hinsichtlich der Zahlenwerte ein realistisches Beispiel angeben mit dem Ergebnis, was du davon erwartest.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Heji
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 17.01.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.01.2020, 17:30     Titel:
  Antworten mit Zitat      
Hallo,

Vielleicht habe ich die Funktion auch noch nicht voll verstanden, aber ich komme damit nicht weiter. Ich habe mal ein realistisches Beispiel angefügt:
Ich habe die Matrix X = [1 2 3 4 5 1 2 3 4 5; 0.01 0.28 0.17 0.01 0.01 0.48 0.39 0.07 0.11 0.02; 0.01 0.28 0.08 0.09 0.19 0.07 0.01 0.29 0.17 0.04]'
Also:
1 0.01 0.01
2 0.28 0.28
3 0.17 0.08
4 0.01 0.09
5 0.01 0.19
1 0.48 0.07
2 0.39 0.01
3 0.07 0.29
4 0.11 0.17
5 0.02 0.04

Als Endergebnis hätte ich gerne eine Matrix in der die Anzahl der Körper, welche sich in einem bestimmten Bereich befinden, stehen. Hier in diesem Fall also würde ich mit 0.1 Schritten die radialen Positionen und dann die jeweils zugehörigen Werte der Höhe durchsuchen und die Anzahl der dort gefundenen Körper rausschreiben.
Also als Ergebnis:

3 1 0 1 1
1 1 0 0 0
1 0 1 0 0

Die Spalten von links nach rechts entsprechen also den Intervallen 0.0=< r <0.1; 0.1=< r <0.2; 0.2=< r <0.3; 0.3=< r <0.4; 0.4=< r <0.5
Die Zeile von oben nach unten 0.0=< z <0.1; 0.1=< z <0.2; 0.2=< z <0.3
So würde mir mein erster Eintrag in der Matrix sagen, dass sich 3 Körper im Bereich von r: 0.0=< r <0.1 und z: 0.0=< z <0.1 aufgehalten haben.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 19.01.2020, 03:29     Titel:
  Antworten mit Zitat      
Hallo,

histcounts2(X(:,2), X(:,3), 0:0.1:0.5, 0:0.1:0.3)'

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Heji
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 17.01.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.01.2020, 09:08     Titel:
  Antworten mit Zitat      
Hallo Harald,

vielen Dank für deine Hilfe! Die Funktion macht wirklich genau das was ich benötige. Falls es jetzt nicht den zeitlichen Rahmen sprengt, rein aus Interesse für mein Verständnis mit Matlab. Die Funktion scheint wie zwei for-Schleifen Abfragen zu funktionierren, wie würde das ganze mit zwei for-Schleifen aussehen?

Viele Grüße
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.