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

"Sprung" (Unstetigkeit) in best. Spalte finden

 

RTS
Forum-Newbie

Forum-Newbie



Beiträge: 4
Anmeldedatum: 16.10.10
Wohnort: Sachsen
Version: ---
     Beitrag Verfasst am: 16.10.2010, 16:16     Titel: "Sprung" (Unstetigkeit) in best. Spalte finden
  Antworten mit Zitat      
Hallo Freunde des Matrix Laboratory.

Ich habe seit mehreren Stunden folgendes Problem:
Aus einer Matrix mit m Spalten und n Zeilen soll der Index der Zeile m gefunden werden, an dem die Zahlen in Spalte 1 einen "Sprung" machen.

Ich hab es (unter anderem) so probiert:
Code:
% Versuch 1
clear
clc

A =[ 1.0  2000 3000 4000 ; ...
     1.1  2001 3002 4003 ; ...
     1.2  2003 3001 4006 ; ...
     2.3  2100 3017 4001 ; ...
     2.4  2101 3019 4012 ];
 
siz = size(A);
m    = siz(1,1);   % Anzahl Zeilen

for k = 1:(m-1)
    ind1(k,1) = find( (A(k+1,1) - A(k,1)) > 0.1 )  % erstellt einen Vektor mit allen Sprungstellen?
end
 


Sollte dabei nicht ind1 zu einem Array mit dem Wert 3 (Index der Zeile vor dem "Sprung" werden? Matlab liefert aber ne Fehlermeldung: ??? Subscripted assignment dimension mismatch. Irgendwas hab ich also falsch gemacht mit dem Befehl find. Confused

Also noch ein anderer Versuch:
Code:
% Versuch2
clear
clc

A =[ 1.0  2000 3000 4000 ; ...
     1.1  2001 3002 4003 ; ...
     1.2  2003 3001 4006 ; ...
     2.3  2100 3017 4001 ; ...
     2.4  2101 3019 4012 ];
 
siz = size(A);
m    = siz(1,1);   % Anzahl Zeilen

for k = 1:(m-1)
    C(k,1)    = (A(k+1,1) - A(k,1))   % Bildung der Differenzen
end

D = find(C > 0.1)


C soll also die Differenzen der einzelnen Werte der Spalte 1 bilden. Funktioniert auch:
Code:
C =

    0.1000
    0.1000
    1.1000
    0.1000


Und D soll die Indices der Zeilen in C finden, wo der der Wert > 0.1 ist. Sollte also ne 3 ausgeben. Matlab liefert aber:
Code:
D =

     1
     3
     4


Was hab ich falsch gemacht, bzw was würdet ihr anders machen?

(Ich weiß, dass man statt der for-Schleife im zweiten Versuch auch den Befehl diff nehmen kann. Aber damit funktioniert es auch nicht. Ich hab die for Schleife genommen um die Art der Differenz vielleicht mal zu ändern, da die Matrizen für die ich das brauche nicht so einfach gestrickt sind wie A hier im Bsp.
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 16.10.2010, 18:06     Titel:
  Antworten mit Zitat      
Hallo,

Code:


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
RTS
Themenstarter

Forum-Newbie

Forum-Newbie



Beiträge: 4
Anmeldedatum: 16.10.10
Wohnort: Sachsen
Version: ---
     Beitrag Verfasst am: 16.10.2010, 20:44     Titel:
  Antworten mit Zitat      
Hi nochmal und Danke Harald,

ich weiß, dass man das ganze mit
Code:
a = 0.11
B=find(diff(A(:,1)) > a)

abkürzen kann. Mit dem Ergebnis:
Code:
B =

     3

Das funktioniert prima für alle a zwischen 0.1 und 1.1 also 0.1 < a < 1.1. Aber wieso funktioniert es nicht für exakt a=0.1 ? Da wird B nämlich zu:
Code:
B =

     1
     3
     4

Aber auch hier müßte doch der Vergleich diff()>a auf den Index "3" führen?

Vielen Dank!
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 17.10.2010, 07:31     Titel:
  Antworten mit Zitat      
Hallo,

meine Vermutung wäre, dass es, da Dezimalzahlen im Binärsystem nicht exakt darstellbar sind, zu minimalen Ungenauigkeiten kommt, sprich: mal kommt 0.099999999999999 heraus, mal 0.10000000000001. Das würde dann zu den von dir beobachteten Problemen beim Vergleich führen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
RTS
Themenstarter

Forum-Newbie

Forum-Newbie



Beiträge: 4
Anmeldedatum: 16.10.10
Wohnort: Sachsen
Version: ---
     Beitrag Verfasst am: 17.10.2010, 14:23     Titel: Lösung
  Antworten mit Zitat      
Hat wohl wirklich was mit der Berechnungs/Darstellungsgenauigkeit zu tun: Denn die gebildeten Differenzen sehen im format short eng so aus:
Code:

C =

    100.000000000000e-003
    99.9999999999999e-003
    1.10000000000000e+000
    100.000000000000e-003
 


Also runde ich jetzt vor dem Vergleich auf zwei Nachkommastellen:
Code:
a = 0.10
B = find(round(diff(A(:,1))*100)/100 > a)

ergibt
Code:
B =

     3


So funktioniert es, wie ich mir das vorgstellt habe. Danke Harald und schönen Sonntag noch.

( PS: Ich lass den Status noch 3-4 Tage auf "mit Vorschlag" bevor ich es als "beantwortet" kennzeichne, vielleicht fällt ja noch jemandem was ein.)
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 18.10.2010, 20:26     Titel:
  Antworten mit Zitat      
Hallo,

wenn es um die Eliminierung numerischer Fehler geht, sollte ein Runden auf etwa 10 oder gar 14 Stellen vollkommen ausreichen. Wenn du auf 2 Stellen rundest, wird ja etwas wie 0,104 auch als 0,10 angesehen, und das ist wohl nicht in deiner Absicht?

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
RTS
Themenstarter

Forum-Newbie

Forum-Newbie



Beiträge: 4
Anmeldedatum: 16.10.10
Wohnort: Sachsen
Version: ---
     Beitrag Verfasst am: 19.10.2010, 18:26     Titel:
  Antworten mit Zitat      
Hi,

in diesem Fall tritt der numerische Fehler ja aber erst weit hinter der zweiten Nachkommastelle auf. Ursprünglich wurden in der Matrix A ja auch nur Werte mit nur einer Nachkommastelle definiert. Und Matlab wird doch nicht bei den berechenten Differenzen, also zB. 0.1 um +/- 0.05 schwanken? Im fünten Beitrag sieht man ja im Ergenis von C wie klein der Fehler ist.

Würde der Fehler bereits in der zweiten Nachkommastelle auftreten, wäre es sowieso besser, wenn ich weiter mit meinem alten GTR rechne, oder versteh ich hier irgendwas falsch?

Grüße aus Dresden
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 19.10.2010, 19:27     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
in diesem Fall tritt der numerische Fehler ja aber erst weit hinter der zweiten Nachkommastelle auf

Eben. Warum also so stark runden?

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