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

Zeilen extrahieren

 

Matlab_Newbiee

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.01.2017, 01:49     Titel: Zeilen extrahieren
  Antworten mit Zitat      
Hallo,

ich habe eine ähnliche Frage. Ich versuche aus einer Riesenmatrix AB_red (4994x 3) nur diese Zeilen zu extrahieren, die in der dritten Spalte den Wert 548.20 haben. Die neue kleinere Matrix soll also wieder 3 Spalten haben und nur die Zeilen, die den Wert 548.20 enthalten. Profil_31 = AB_red(AB_red(:,3)==548.20 ,1:3) funktioniert bei der großen Matrix AB_red nicht, und wird eine leere Matrix ausgegeben. Bei der Matrix AB_red_Auszug funktioniert allerdings der gleiche Code/Befehl. Ich kann mir nicht erklären wieso bei der Matrix AB_red das nicht geht.


Code:
clc; clear;
AB_red =importdata('.\AB_red.mat');
size_AB_red=size(AB_red)

Profil_31 = AB_red(AB_red(:,3)==548.20 ,1:3)


AB_red_Auszug=[  -41.3656  591.5555  541.0000
  -77.7936  590.9011  541.0000
  219.9190  604.2224  548.2000
  215.9288  601.4115  548.2000
  212.6350  600.4626  548.2000
  207.3754  593.8320  548.2000
  204.7824  594.7312  548.2000
  200.8997  591.8313  548.2000
  195.1011  591.6626  548.2000
  189.0159  590.4854  548.2000
  186.7383  592.2582  548.2000
  144.7507  591.5473  548.2000
  143.1020  596.0628  548.2000
  140.7290  597.6549  548.2000
  139.2447  603.1351  548.2000
  136.3910  602.7616  548.2000
  133.7597  603.3509  548.2000
  130.0649  599.0427  548.2000
  127.0340  597.6482  548.2000
  124.2215  597.2177  548.2000
  121.6144  597.7541  548.2000
  118.2247  594.3559  548.2000
  116.0119  596.8293  548.2000
  114.3392  602.2421  548.2000
  110.4347  595.8525  548.2000
  108.3676  599.2808  548.2000
  105.4044  597.7783  548.2000
  102.2871  595.2759  548.2000
  100.3489  599.6616  548.2000
   97.2493  597.1328  548.2000
   94.6429  597.5514  548.2000
   91.7304  595.9820  548.2000
   88.9813  595.3875  548.2000
   86.6695  597.7494  548.2000
   83.5039  594.1608  548.2000
   81.0454  595.5104  548.2000
   79.2294  601.8070  548.2000
   76.0980  598.1790  548.2000
   73.3653  597.5128  548.2000
   70.9926  599.8133  548.2000
   67.9219  596.1431  548.2000
   65.5379  598.4219  548.2000
   62.4035  593.7296  548.2000
   60.5136  600.9610  548.2000
   57.3158  595.2469  548.2000
   54.6265  594.4955  548.2000
   52.2063  596.7206  548.2000
   49.2709  592.9565  548.2000
   46.6832  593.1658  548.2000
   41.6446  595.5457  548.2000
   39.2419  598.7154  548.2000
   36.5070  596.8846  548.2000
   33.8456  596.0398  548.2000
   31.2969  597.1805  548.2000
   28.6909  597.3113  548.2000
   26.0844  597.4308  548.2000
   23.2026  590.5444  548.2000
   20.7303  593.6382  548.2000
   18.3536  600.7197  548.2000
   15.6015  595.7958  548.2000
   12.9799  594.8584  548.2000
   10.3493  592.9097  548.2000
    7.7360  590.9494  548.2000
    5.2010  595.9773  548.2000
    2.6005  595.9943  548.2000
    0.0000  595.0000  548.2000
   -2.5831  591.9944  548.2000
   -7.7752  593.9491  548.2000
  -10.3493  592.9097  548.2000
  -12.9144  591.8591  548.2000
  -23.3203  593.5420  548.2000
  -25.8227  591.4365  548.2000
  -28.4031  591.3182  548.2000
  -30.9829  591.1887  548.2000
  -33.5621  591.0479  548.2000
  -36.2628  592.8921  548.2000
   220.6030  606.1017  555.4000
  217.9563  607.0585  555.4000];

Profil_31_red=AB_red_Auszug(AB_red_Auszug(:,3)==548.20 ,1:3);
size_Profil_31_Auszug=size(Profil_31_Auszug)
 

Als Ausgabe bekomme ich:

size_AB_red =

4994 3


Profil_31 =

Empty matrix: 0-by-3


size_Profil_31_Auszug =

74 3

>>


Für jede Hilfe bin ich dankbar!

Gruß
Matlab_Newbiee

[EDITED, Jan, Bitte Code-Umgebung verwenden - Danke!]


Harald
Forum-Meister

Forum-Meister


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

ohne die Daten zu haben ist das schwer zu sagen.

Vermutung: die Daten sind nicht genau 548.20, sondern minimal abweichend. Ich würde statt == 548.20 mal abs(... - 548.20) < 1e-9

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
Gesplittet: 15.01.2017, 14:12 Uhr von Jan S
Von Beitrag Vektror zerlegen/ in Teilvektoren aufspalten aus dem Forum Programmierung
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 15.01.2017, 14:48     Titel: Re: Zeilen extrahieren
  Antworten mit Zitat      
Hallo Matlab_Newbiee,

Bitte hänge keine neuen Fragen an bestehende Threads an und verwende die Code-Umgebung - Danke!

Zitat:
Profil_31 = AB_red(AB_red(:,3)==548.20 ,1:3) funktioniert bei der großen Matrix AB_red nicht, und wird eine leere Matrix ausgegeben.

Überlege mal: Matlab ist eine deterministische Programmiersprache und wirklich gut getestet. Die Idee, dass die gezeigte Zeile "nicht funktioniert" ist deshalb ziemlich originell oder sogar abwegig. Weitaus naheliegender wäre es, Matlab zu glauben und zu sehen, dass die 3. Spalte keine Werte enthält, die 548.20 sind.
Du erwartest aber, dass solche Werte auftauchen. Zu klären wäre also eigentlich, warum Du das erwartest, denn hier liegt da Problem.

Einerseits zeigt Matlab Komma-TZahlen nur mit einer begrenzten Anzahl von Stellen an. 548.199999999999999 würde also je nach format Einstellung auch als 548.2 angezeigt werden. Andererseits werden in Matlab (wie in allen anderen Sprachen, die mit DOUBLEs rechnen auch) Fließkommazahlen nach dem IEEE754-Standard binär gespeichert, wofür nur eine begrenzte Anzahl von Bits zur Verfügung steht. Die meisten (mathematisch korrekt: "fast alle") Dezimal-Zahlen haben aber keine exakte Darstellung im Binär-Format mit begrenzter Genauigkeit. Daher stammt der Ebvergreen in der FAQ:
Zitat:
Warum ist:
Code:
any(0:0.1:1 == 0.3) == false
?

Vergleiche zwischen Fließkommazahlen benötigen deshalb immer eine Toleranz (siehe Harald's Antwort). Ob die nun relativ oder absolut ist und wie hoch genau, hängt leider immer von der Aufgaben-Stellung ab. Bei
Code:
1e19 + 1000 - 1e19

liegt man mit der erwarteten Antwort schon ganz schön daneben.

Quiz: Was ist das Ergebnis von
Code:
1e18 + 1000 - 1e18

?

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