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

Zahl in Vektor finden schlägt fehl, obwohl Wert vorhanden

 

Max24
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 60
Anmeldedatum: 29.06.14
Wohnort: Deutschland
Version: ---
     Beitrag Verfasst am: 31.03.2017, 08:54     Titel: Zahl in Vektor finden schlägt fehl, obwohl Wert vorhanden
  Antworten mit Zitat      
Moin, ich habe eine Funktion zum Integrieren geschrieben, der ich die untere (time_min) und die obere (time_max) Integrationsgrenze (Zeitintervall) übergebe.
Der Vektor "dataset" soll dann entsprechend zugeschnitten werden, indem der untere und obere Index gefunden wird. Hier stellt "measurement.time" den Zeitvektor dar.

Die Funktion funktioniert wunderbar, allerdings schlägt der Vergleich für einen bestimmten Wert (time_max = 2.97) fehl.
index_end = find(measurement.time == time_max) bleibt ein leerer Wert [].
Wenn ich dasselbe ausführe mit:
index_end = find(measurement.time == 2.97) erhalte ich den gewünschten Index, obwohl dies time_max entspricht.

Anscheinend stellen time_max und 2.97 händisch eingetippt nicht denselben numerischen Wert dar. Handelt es sich hier um einen Bug, oder kommt so etwas öfter vor und man muss aufpassen mit einem Zahlenvergleich nach Werten in einem Vektor zu suchen?

Wenn ich folgendes Casting vornehme, tritt der Fehler nicht mehr auf:
time_max = str2num(num2str(time_max));

Code:

function integral = integrate_data(dataset, timestep, time_min, time_max)          
        if nargin > 2
            time_max = str2num(num2str(time_max)); % creepy error, casting solves
            index_start = find(measurement.time == time_min);
            index_end = find(measurement.time == time_max);
            if isempty(index_end)
                disp('Error!')
            end
            dataset = dataset(index_start:index_end);
        end
 



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


Harald
Forum-Meister

Forum-Meister


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

vermutlich treten irgendwo in deiner Berechnung minimale Rundungsfehler auf. Besser als ein Test auf Gleichheit ist grundsätzlich ein Test auf geringfügige Abweichung:
abs(x-y) < tol statt x == y

Ein Beispiel:
Code:
0.1 + 0.1 + 0.1 == 0.3
(0.1 + 0.1 + 0.1) - 0.3


Grüße,
Harald
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: 03.04.2017, 14:38     Titel: Re: Zahl in Vektor finden schlägt fehl, obwohl Wert vorhand
  Antworten mit Zitat      
Hallo Max24,

Das hört sich nach dem Klassiker unter den FAQ an:
Code:
find(0:0.1:1 == 0.3)
% Empty matrix

Das liegt an der begrenzten Anzahl von Stellen im DOUBLE Format. Suche nach "IEEE754" im Netz. Die meisten Dezimal-Zahlen haben keine exakte Darstellung im Binär-Format (un umgekehrt). Deshalb ist 0.1 + 0.1 + 0.1 ~= 0.3 (siehe Haralds Beispiel - wie gesagt: ein tausendfach gefragter Klassiker). Wenn Du also nach 2.97 suchst, geht das wahrscheinlich nur über eine Toleranz:
Code:
find(abs(measurement.time - 2.97 =< 0.0001)

Das Limit hängt dabei von den Daten ab, es gibt da keine generell "richtige" Wahl.

Code:

Das sieht sehr gruselig aus. Ich bin sicher, das lässt sich besser lösen.

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