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

Löschen von Matrizenwerten

 

Kalle1963

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.03.2013, 23:59     Titel: Löschen von Matrizenwerten
  Antworten mit Zitat      
Hallo Zusammen,

ich hab hier eine 3D Matrix in der im ersten Tensor die x Werte, im zweiten die y - Werte und im dritten die z -Werte enthalten sind

Code:
data = [20,20,3]


Wenn im 3.Tensor, also den z- Werten, eine Null steht, sollte dieser Punkt mit samt seinen x und y Werten aus der Matrix verschwinden. Also wenn data2(i,j,3) = 0 dann soll data2(i,j,2) und data2(i,j,1) auch gelöscht werden.

Mein Ansatz funktioniert leider nicht:

Code:
data2 = ((data2) ==0) = NaN;

data2(any(isnan(data2)),3) = [];


für jegliche Hilfe wäre ich sehr dankbar.

grüssle Kalle


Kalle1963

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.03.2013, 00:03     Titel:
  Antworten mit Zitat      
es muss natürlich heißen:

Code:
data2((data2) ==0) = NaN;


funktioniert leider trotzdem nicht... Surprised
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 12.03.2013, 00:59     Titel: Re: Löschen von Matrizenwerten
  Antworten mit Zitat      
Hallo Kalle1963,

"Matrix" bezeichnet ein 2D-Array. Der Ausdruck "Tensor" ist hier verwirrend.
Wozu dienen die NaNs in Deinem Ansatz?

Was möchtest Du als Ausgabe bekommen?
Nimm mal an, die Daten bestünden nur aus Einsen bis auf eine Null:
Code:
x = ones(20, 20, 3);
x(1,2,3) = 0;

Wenn Du nun x(1,2,:) löschst, hat der verbleibende Rest unterschiedliche Längen für die Zeilen und Spalten. Damit ist es kein Array mehr. Als Vektor kann man das auf jeden Fall noch darstellen, aber möchtest Du das?

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.03.2013, 01:10     Titel:
  Antworten mit Zitat      
Hallo Jan, danke für die Antwort noch um diese Uhrzeit.



Ja, ich denk schon das ich das will. Smile

Bei den x und y Werten, dürfen Nullen vorkommen, aber sobald eine Null bei den z Werten ist, sollte diese Position gelöscht werden, die x und y Werte an dieser Stelle interessieren dann nicht mehr und sollen eben nicht mehr dargestellt werden.

Ich hoff du kannst verstehen worauf ich hinaus will Smile

Ps: Ist
Code:
x = ones(20, 20, 3);
keine 3D Matrix?

grüssle Kalle
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 12.03.2013, 02:39     Titel:
  Antworten mit Zitat      
Hallo Kalle1963,

Ich verstehe noch nicht, worauf Du hinaus willst.

ones(20, 20, 3) ist ein 3D-Array.
ones(20, 3) ist eine Matrix. Matrizen sind immer 2D.
ones(1, 3) und ones(20, 1) sind Vektoren.

Man kann nun nicht einfach einen Subvektor aus einem 3D-Array löschen, genaus wie man in einer Matrix nicht ein einzelnes Element löschen kann:
Code:
x = ones(2,2);
x(1,1) = [];   %FEHLER! ??? Subscripted assignment dimension mismatch.

Deswegen weiß ich noch nicht, wie das Ergebnis nach dem Löschen aussehen soll.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Seban
Forum-Meister

Forum-Meister


Beiträge: 600
Anmeldedatum: 19.01.12
Wohnort: ---
Version: ab R2014b
     Beitrag Verfasst am: 12.03.2013, 09:35     Titel:
  Antworten mit Zitat      
Moin,

Das sollte helfen:
http://www.gomatlab.de/veraendern-v.....eines-tensors-t27848.html

Grüße,
Seban
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: 12.03.2013, 09:47     Titel:
  Antworten mit Zitat      
Hallo Seban,

Leider hilfr genau dies nicht: Während man problemlos einen Sub-Vektor auf 0 setzen kann, funktioniert das Löschen nicht.

Ein [20 x 30 x 3] Array hat 60*3 Elemente. Wenn ein Element in der 3. Komponente ist 0, sollen 3 Elemente davon gelöscht werden. Danach hat also 59*3 Elemente, und das kann man nicht mehr in ein [M x N x 3] Array packen, da 59 eine Primzahl ist. Insbesondere weder M=20 noch N=30 möglich.
Machbar ist aber eine [59 x 3] Matrix als Ergebnis. Aber hier muss der OP erstmal erklären, ob das so gewollt ist.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Seban
Forum-Meister

Forum-Meister


Beiträge: 600
Anmeldedatum: 19.01.12
Wohnort: ---
Version: ab R2014b
     Beitrag Verfasst am: 12.03.2013, 12:35     Titel:
  Antworten mit Zitat      
Hallo Jan,

Hier hat er geschrieben, dass er die Werte, die gleich 0 sind durch NaN ersetzen möchte.
Kalle1963 hat Folgendes geschrieben:
es muss natürlich heißen:

Code:
data2((data2) ==0) = NaN;


funktioniert leider trotzdem nicht... Surprised

Ich nahm an mit Löschen meint Kalle auf NaN setzen.

Das kann er mit Hilfe des von mir geposteten Threads lösen.
Bspw. so:
Code:
t= rand(20, 20, 3);
temp = t(:,:,3);
temp(t(:,:,3)<0.2) = 0;
t(:,:,3) = temp; % t ist Ausgangs-Array mit 0en in 'z'

log_zeros_in_z = (t(:,:,3)==0);
log_zeros = repmat(log_zeros_in_z, 1, 3);
log_zeros = reshape(log_zeros, 20, 20, 3);

t(log_zeros) = NaN;


Wenn er es anders gemeint hat, hast du ihn ja bereits richtigerweise aufgeklärt und in dem Fall sollte meine Antwort ein Hinweis sein, wie man es machen könnte.

Beste Grüße,
Seban
Private Nachricht senden Benutzer-Profile anzeigen
 
Kalle1963

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.03.2013, 13:45     Titel:
  Antworten mit Zitat      
Hallo Jan, Hallo Seban,

erstmal großes Dankeschön, dass ihr euch meines Problems widmet.

Ich habe vllt vergessen zu erwähnen, dass das 3D Array aus Messwerten besteht, dass ich nun auswerten darf.
Das Hauptproblem dabei ist, das er mir die Fläche sobald ich sie mit mesh oder surf plotte zwar anzeigt, sie aber mit dem Ursprung zusammenhängt, weil einige der z-Werte als Nullen abgespeichert sind.
Setze ich nun alle Nullen in der Matrix gleich NaN, so sind zwar die "bösen" Nullen bei z (:,:,3) verschwunden, jedoch auch die Nullen bei x (:,:,1) und y (:,:,2) und somit wird der entstehende Graph (Fläche) wieder verfäscht. Die Werte müssen nicht gelöscht werden, sie dürfen nur nicht angezeigt werden.

Ich hab es nun nach deiner Idee gemacht, Seban. Hatte aber leider noch keinen Erfolg damit.
falls noch jemand eine Idee hat, raus damit Very Happy

grüssle Kalle
 
Seban
Forum-Meister

Forum-Meister


Beiträge: 600
Anmeldedatum: 19.01.12
Wohnort: ---
Version: ab R2014b
     Beitrag Verfasst am: 12.03.2013, 16:22     Titel:
  Antworten mit Zitat      
Kalle1963 hat Folgendes geschrieben:
Das Hauptproblem dabei ist, das er mir die Fläche sobald ich sie mit mesh oder surf plotte zwar anzeigt, sie aber mit dem Ursprung zusammenhängt, weil einige der z-Werte als Nullen abgespeichert sind.
Setze ich nun alle Nullen in der Matrix gleich NaN, so sind zwar die "bösen" Nullen bei z (:,:,3) verschwunden, jedoch auch die Nullen bei x (:,:,1) und y (:,:,2) und somit wird der entstehende Graph (Fläche) wieder verfäscht. Die Werte müssen nicht gelöscht werden, sie dürfen nur nicht angezeigt werden.

Dann sollte es doch eigentlich reichen die z-Werte (die =0 sind) auf NaN zu setzen. Die zugehörigen x & y braucht man nicht ändern. Der Punkt (x, y, z) wird nicht dargestellt, wenn ein Wert NaN ist. Oder vertue ich mich jetzt?

Grüße
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: 12.03.2013, 17:09     Titel:
  Antworten mit Zitat      
Hallo Kalle1963,

Bitte schreibe nicht nur "Hatte aber leider noch keinen Erfolg damit", sondern beschreibe, was genau passiert ist. Ansonsten können wir kaum Verbesserungsvorschläge machen.

Nun ist also geklärt, das die Elemente nich gelöscht, sondern auf NaN gesetzt werden sollen. Das sollte eigentlich so möglich sein:
Code:
isZero = any(t == 0, 3);
s = size(t);
t = reshape(t, [], s(3));
t(isZero, :) = NaN;
t = reshape(t, s);

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.03.2013, 17:30     Titel:
  Antworten mit Zitat      
nochmals danke für die Rückmeldung.

@ Seban
du hast es richtig verstanden und damit recht, dass nur die z Werte auf NaN gesetzt werden müssen

@ Jan

Ok, sorry das ich das wohl nicht genau beschrieben hatte. Das Problem bis jetzt ist, dass ich entweder alle Nullen in dem Array auf NaN setzen kann, oder gar keine.
Sobald alle Nullen auf NaN gesetzt werden, zeichnet er mir die Werte für x = 0 und y = 0 natürlich auch nicht, aber das wäre schon notwendig. Das Ziel wäre es nur die Nullen im z-Bereich (:,:,3) auf NaN zu setzen.

Auch mit diesem Ansatz werden die Nullen des _gesamten_ Arrays auf NaN gesetzt.
Code:

isZero = any(t == 0, 3);
s = size(t);
t = reshape(t, [], s(3));
t(isZero, :) = NaN;
t = reshape(t, s);
 


kann man das nicht irgendwie rein auf den dritten 'Tensor' (:,:,3) beziehen?

gruss Kalle
 
Seban
Forum-Meister

Forum-Meister


Beiträge: 600
Anmeldedatum: 19.01.12
Wohnort: ---
Version: ab R2014b
     Beitrag Verfasst am: 12.03.2013, 18:42     Titel:
  Antworten mit Zitat      
Hi,

Jetzt sollte es passen:
Code:
z = t(:,:,3);    % t ist dein Array, z ist die dritte Ebene
z(z == 0) = NaN;    % 0en finden und ersetzen
t(:,:,3) = z;    % Änderungen in Array übernehmen


Grüße,
Seban
Private Nachricht senden Benutzer-Profile anzeigen
 
Kalle1963

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.03.2013, 18:55     Titel:
  Antworten mit Zitat      
Hallo Seban, das wars. Diese Lösung funktioniert genauso wie ich es mir gewünscht hatte. Vielen Dank, du warst mir eine sehr große Hilfe.

Auch vielen Dank an Jan.

grüssle Kalle
 
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.