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

Unsortierte Werte einer Matrix sortiert einer 2. zuordnen

 

Claudio

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.11.2016, 14:13     Titel: Unsortierte Werte einer Matrix sortiert einer 2. zuordnen
  Antworten mit Zitat      
Hallo zusammen,

Ich bin gerade an einer Datenanalyse und komme einfach nicht mehr weiter.

Ausgangssituation: Ich habe für ein Gebiet Niederschlagsdaten (mm/d) zur Verfügung. Diese Daten haben eine Auflösung von ca. 1.6x2.1km. Mein Gebiet wird von 181 Zellen mit Niederschlagsdaten abgedeckt.

Nun möchte ich sagen können, welche Bodenart in der jeweiligen Zelle mit Niederschlag dominant ist (z.B. Schnee, Wald, Siedlungsgebiet, etc.). Diese Info nutze ich, um einen Wasserspeicher einzubauen (Interzeption, Regenrückhalt auf Vegetation). Ich habe eine Bodenkarte für mein Gebiet zur Verfügung. Jede Zelle hat einen Wert zw. 1 und 15 (für Schnee, Wald, Wiese, etc.), die Legende dazu habe ich. "Leider" hat meine Bodenkarte eine Auflösung von 100x100m (und nicht diesselbe wie meine Niederschlagsdaten).
Ich habe nun eine Matrix "map" generiert, die mir für jede 100x100m Zelle der Bodenkarte sagt, zu welcher der 181 Niederschlagszellen sie gehört.

Ziel: Ich erstelle eine Matrix A, die alle Werte der Bodenkarte pro Niederschlagszelle in eine Spalte aufweist (ergo 181) Spalten. Diese Matrix A nutze ich dann, um jede Spalte durchzuzählen und die dominante Bodenbedeckung zu ermitteln.

Ich hoffe ich habe das Problem klar formuliert. Die "map" und die "bodenkarte" habe ich angehängt.

- NaN oder -9999 bezeichnen Zellen, die ausserhalb meines Gebietes liegen.
- Da einige Niederschlagszellen am Rand meines Gebietes sind, haben nicht alle Zellen gleich viele Zellen aus der Bodenkarte. Die Matrix A muss ich dann jeweils mit 0 auffüllen.

Herzlichen Dank für eure Hilfe! Ich habs nicht geschafft, diese unterschiedlichen Zuordnungen zu codieren.

Grüsse Claudio

map.mat
 Beschreibung:

Download
 Dateiname:  map.mat
 Dateigröße:  11.95 KB
 Heruntergeladen:  437 mal
landcover.mat
 Beschreibung:

Download
 Dateiname:  landcover.mat
 Dateigröße:  2.5 KB
 Heruntergeladen:  440 mal


Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.11.2016, 15:05     Titel:
  Antworten mit Zitat      
Hier die original Bodenkarte mit den Einträgen zw. 1 bis 15. (die mit der Frage angehängte Bodenkarte war bereits überschrieben wie ich gerade gemerkt habe).

landcover.mat
 Beschreibung:

Download
 Dateiname:  landcover.mat
 Dateigröße:  18.62 KB
 Heruntergeladen:  414 mal
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 18.11.2016, 18:52     Titel:
  Antworten mit Zitat      
Hallo.

Zitat:
Ausgangssituation: Ich habe für ein Gebiet Niederschlagsdaten (mm/d) zur Verfügung. Diese Daten haben eine Auflösung von ca. 1.6x2.1km. Mein Gebiet wird von 181 Zellen mit Niederschlagsdaten abgedeckt.

Nun möchte ich sagen können, welche Bodenart in der jeweiligen Zelle mit Niederschlag dominant ist...

Ab hier kann ich nicht mehr folgen. Für Matlab sind das doch alles Zahlen. Deshalb helfen die Beschreibungen der physikalischen Bedeutung nicht, das Programmier-Problem zu verstehen.

Kannst Du einen kleinen Beispiel-Datensatz als Text posten und daran zeigen, was Du als Ergebnis suchst? Dazu brauchen wir nur den Typ und den Inhalt des Inputs, aber keinerlei Bedeutungen.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Claudio

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.11.2016, 23:21     Titel:
  Antworten mit Zitat      
Alles klar.

Beispielsmatrix
"map"
1 1 2 2
1 1 2 2
1 1 3 3
4 4 3 3

"landcover"
6 6 7 8
3 4 3 5
1 2 5 9
4 5 5 4

Zielmatrix
(die 1 aus "map" ist die 1. Spalte gefüllt mit den zugehörigen Werten aus der "landcover" matrix)
6 7 5 5
6 8 9 4
3 3 5 0
4 5 4 0
1 0 0 0
2 0 0 0

Die aufgefüllten Werte müssen nicht sortiert sein.

Danke für die Hilfe! Ich hoffe, jetzt ist es verständlicher Smile
 
Jan S
Moderator

Moderator


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

Und wie lautet die Vorschrift, mit der man von den beiden Inputs zum gewünschten Output kommt?

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Claudio

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.11.2016, 15:52     Titel:
  Antworten mit Zitat      
Hallo Jan,

Ich habe versucht, mit for schlefen jede zelle mit einer if bedingung anzufragen ob der wert der "map" eine zahl zw 1 bis 181 ist und dann derselbe wert der "landcover" in eine neue matrix in die entsprechende spalte zu schreiben. Aber es hat nicht geklappt, dass die neue matrix fortlaufend aufgefüllt wird.

Diese "vorschrift" suche ich ja.

Gruss Claudio
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 19.11.2016, 23:15     Titel:
  Antworten mit Zitat      
Hallo Claudio,

Dann drücke ich es mal anders aus: Ich sehe den Zusammenhang zwischen "map", "landcover" und der Zielmatrix nicht.

Zitat:
ob der wert der "map" eine zahl zw 1 bis 181 ist und dann derselbe wert der "landcover" in eine neue matrix in die entsprechende spalte zu schreiben.

Das kommt der Lösung schon näher. Die Zaheln aus Map werden gesucht und falls sie zwischen 1 und 181 liegen, wird welcher selbe Wert aus landcover genommen? Meinst Du das Element an der gleichen Position? Was ist dann "die entsprechende Spalte"?

Du hattest auch geschrieben:
Zitat:
Diese Matrix A nutze ich dann, um jede Spalte durchzuzählen und die dominante Bodenbedeckung zu ermitteln.

Das ist bestimmt wichtig und Dir auch klar, aber wenn man gar keine Ahnung hat, was das Ziel ist, kommt man nicht dahinter, was es bedeutet.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Claudio

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.11.2016, 23:40     Titel:
  Antworten mit Zitat      
Sali Jan,

Danke für deine Bemühungen. Ich versuchs, den Zusammenhang noch klarer zu erklären.

Ich gehe in die map Matrix und nehme den Wert an der Stelle (1/1), das wäre im Beispiel der Wert 1. Dann gehe ich in die landcover Matrix und nehme an derselben Stelle den Wert, hier also 6. Dann schreibe ich den Wert aus der landcover Matrix (6) in die Spalte der Zielmatrix, die dem Wert aus der map Matrix entspricht (hier also 1, ergo in die erste Spalte).

Da in der map Matrix mehrere Male die 1 vorkommt (hier 4x), gibt es in der Zielmatrix in der ersten Spalte 4 Zeilen mit einem Wert aus der landcover Matrix (bei den anderen Spalten eine unterschiedliche Anzahl von Werten aus der Landcover Matrix).

Ich hoffe, so ist es besser verständlich.

Vielen Dank für die Hilfe.
Claudio
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 20.11.2016, 21:21     Titel:
  Antworten mit Zitat      
Hallo Claudio,

Vorschlag:
Code:
map = [1 1 2 2; ...
   1 1 2 2; ...
   1 1 3 3; ...
   4 4 3 3];

landcover = [6 6 7 8; ...
   3 4 3 5; ...
   1 2 5 9; ...
   4 5 5 4];

% Ignore values out of range:
mapFull  = map(map(:) >= 1 & map(:) <= 181);

% Unique map values:
mapValue = unique(mapFull);

% For the pre-allocation of the output - max number of map values:
mapWidth = max(histcounts(mapFull, mapValue));

% Pre-allocate:
Result = zeros(mapWidth, length(mapValue));

% Loop over map-values:
for iMap = 1:length(mapValue)
   index = (map == mapValue(iMap));
   Result(1:nnz(index), iMap) = landcover(index);
end

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Claudio

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.11.2016, 09:25     Titel:
  Antworten mit Zitat      
Hoi Jan,

Vielen Dank für dein Vorschlag! Das funktioniert tip top Smile

Ich habe es noch auf einem anderen Wege versucht:

Code:
map = [1 1 2 2; ...
   1 1 2 2; ...
   1 1 3 3; ...
   4 4 3 3];

landcover = [6 6 7 8; ...
   3 4 3 5; ...
   1 2 5 9; ...
   4 5 5 4];
n = length(map(:,1));%Anzahl Zeilen
m = length(map(1,:));%Anzahl Spalten
A = zeros(n,m);

%Zuweisung der Werte (Landnutzung) in die Spalte der entsprechenden Zellennummer
%Die spalten entsprechen den Niederschlagszellen
for a = 1:4;%Anzahl Spalten
    counter = 1;
    for i = 1:n;
        for j = 1:m;
            if map(i,j) == a;%Wenn der Wert in der Zelle dem Spaltenwert entspricht
                A(counter,a) = landcover(i,j);%dann schreibe den Wert an derselben Stelle der Landnutzungsmatrix in die Matrix A in die Spalte des Spaltenwerts
                counter = counter + 1;%und erhöhe den counter um 1 (um den nächsten Wert in die nächste Zeile derselben Spalte zu schreiben)
            end
        end
    end
end


Was würde für deinen Vorschlag statt meiner Idee sprechen?

Grüsse Claudio
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 21.11.2016, 10:46     Titel:
  Antworten mit Zitat      
Hallo Claudio,

Code:
n = length(map(:,1));%Anzahl Zeilen

size(map, 1) ist effizienter statt einen Vektor zu erzeugen, seine Länge zu bestimmen und ihn dann gleich wieder zu löschen.

Code:
m = length(map(1,:));%Anzahl Spalten
A = zeros(n,m);

Die Länge der ersten Dimension hängt von der Anzahl der Werte in map ab, nicht von der Größe der Matrix selbst.

Zitat:
Was würde für deinen Vorschlag statt meiner Idee sprechen?

Ich denke, mein Vorschlag läuft schneller. Wenn die Input-Arrays klein sind, fällt das nicht ins Gewicht.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Claudio

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.11.2016, 11:54     Titel:
  Antworten mit Zitat      
Sali Jan,

Alles klar, merci für deine Erklärung und Hilfe!

Grüsse Claudio
 
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.