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 doppelten Werten innerhalb einer Matrix

 

udo99
Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 28.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.11.2011, 23:45     Titel: Löschen von doppelten Werten innerhalb einer Matrix
  Antworten mit Zitat      
Hallo, nach 4 Stunden verzweifelten rumversuchen möchte ich hier um Hilfe fragen, bevor mein Laptop aus dem Fenster fliegt.

Also ich habe 3 Matrizen 28x984 28x984 und 28x981. Es sollte 981 Werte für Spannungen im Material geben, das FEM Programm hat an genau vier Knoten verschiedene Spannungen, daher 984 statt 981. Ich muss diesen Fehler nun kompensieren und 3 Werte löschen. Meine Idee war folgende:

Code:

for k=1:lam.stress.l;
    if lam.stress.s12.all.data(k,1) == lam.stress.s22.all.data(k,1);
    else
        if length(lam.stress.s12.all.data) > length(lam.stress.s22.all.data);
            lam.stress.s12.all.data(k,:) = [];
        else
            lam.stress.s22.all.data(k,:) = [];
        end
    end
end
 


Nur löscht der die Spalten nicht für das jeweilige k, sondern springt weiter. Ich verstehe nicht wie Matlab da rechnet.
Mit ~ifequal und unique etc. bin ich auch nicht glücklich geworden, wäre nett wenn ihr mir helft.

Gruß Udo.
Private Nachricht senden Benutzer-Profile anzeigen


Andreas Goser
Forum-Meister

Forum-Meister


Beiträge: 3.654
Anmeldedatum: 04.12.08
Wohnort: Ismaning
Version: 1.0
     Beitrag Verfasst am: 29.11.2011, 08:21     Titel:
  Antworten mit Zitat      
Ohne die Daten selber ist es nicht ganz so einfach zu beantworten. Grundsätzlich ist aber der Vergleich zweier DOUBLE Werte immer kritisch, siehe Mini Beispiel:

Code:

a=1
b=a+eps
a==b
ans =
     0


Andreas
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
eupho
Forum-Meister

Forum-Meister


Beiträge: 777
Anmeldedatum: 07.01.09
Wohnort: Marburg
Version: R2009b
     Beitrag Verfasst am: 29.11.2011, 08:54     Titel:
  Antworten mit Zitat      
Beim Vergleich zweier Doubles immer >, >=, <, <= benutzen (mit einem Intervall, z.B. [x-eps, x+eps])
Private Nachricht senden Benutzer-Profile anzeigen
 
udo99
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 28.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.11.2011, 12:10     Titel:
  Antworten mit Zitat      
Also ich habe eine Spalte mit gleichen Werten (:,1), immer 4 Zeilen von 1000 verschwinden nicht, da die restlichen Spaltenzeilen unterschiedliche Werte zeigen. Mir ist eigtl völlig gleich welche Zeilen er löscht, hauptsache er löscht 3 von 4 Zeilen, sodass mein Auswertungsskript funktioniert.

Wenn ich Matlab wäre und ich würde merken, ohh Zeile 667 ist unterschiedlich, dann würde ich laut obiger Schleife diese doch löschen, mit k= 668 weiterarbeiten, wieder unterschiedlich, wieder löschen, solange bis alle 3 überflüssigen Zeilen weg sind?!?

Nur warum tut er das nicht, ich habe mir das mal im Debug Mode angeschaut, er löscht die Zeilen zwar, nur ein paar k's später, für mich willkürlich?!

Gruß
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 29.11.2011, 12:59     Titel:
  Antworten mit Zitat      
wozu is das
Code:
if lam.stress.s12.all.data(k,1) == lam.stress.s22.all.data(k,1);
else
 
danach kommt gleiche else. da kannst doch gleich ~= machen
oder?
außerdem löscht du eine zeile und machst danach k+1 was dazu führt das wenn 2 zeilen hintereindander die bedingung erfüllen würde er sich die eine garnicht mehr anguckt.
Private Nachricht senden Benutzer-Profile anzeigen
 
udo99
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 28.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.11.2011, 13:52     Titel:
  Antworten mit Zitat      
So hier?

Code:

for k=1:lam.stress.l;
    if lam.stress.s12.all.data(k,1) ~= lam.stress.s22.all.data(k,1);
 
        if length(lam.stress.s12.all.data) > length(lam.stress.s22.all.data);
            lam.stress.s12.all.data(k,:) = [];
            k=k-3
        else
            lam.stress.s22.all.data(k,:) = [];
              k=k-3
    end
   
end
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 29.11.2011, 14:12     Titel:
  Antworten mit Zitat      
Code:

k=1
while k<=lam.stress.l;
    if lam.stress.s12.all.data(k,1) ~= lam.stress.s22.all.data(k,1);
 
        if length(lam.stress.s12.all.data) > length(lam.stress.s22.all.data);
            lam.stress.s12.all.data(k,:) = [];
            k=k-1
        else
            lam.stress.s22.all.data(k,:) = [];
              k=k-1
    end
    k=k+1
end
 

da ich deine daten nicht da hab kann ich das grade nicht testen aber versuchs mal
Private Nachricht senden Benutzer-Profile anzeigen
 
udo99
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 28.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.11.2011, 23:05     Titel:
  Antworten mit Zitat      
Sehr geil, es klappt Wink !!!

Also könnt ihr mir abschließend nochmal sagen, warum das jetzt nur mit einer while und nicht mit einer if Schleife funktioniert ?? Nur fürs Verständnis.

Vielen Dank, Udo.
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 30.11.2011, 08:49     Titel:
  Antworten mit Zitat      
Code:
for k=1:10
k=k-1
end

kannst ja mal duchlaufen lassen. ich weis auch nicht genau warum aber anscheinend kann man in der forschleifen die laufvariable nicht verändern.
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: 30.11.2011, 10:11     Titel:
  Antworten mit Zitat      
Hallo Winkow,

Das Verhalten von "for k = 1:2; k=10; end" wird ausdrücklich in "doc for" erklärt. Siehe "Remarks".

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 - 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.