Zahl in Vektor finden schlägt fehl, obwohl Wert vorhanden - Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Bücher:

Fachkräfte:
Softwareentwickler (m/w) automatische Codegenerierung
Umsetzung, Neuprogrammierung und Weiterentwicklung in Simulink, TargetLink und C
EFS - Ingolstadt, Wolfsburg

Informatiker (m/w) für den Bereich Toolkette Embedded Software
Weiterentwicklung einer MATLAB-/Simulink-Toolkette, Automatisierung der Code-Generierung mit TargetLink und Embedded Coder
cbb-Software GmbH - Stuttgart

Prüfingenieur im Bereich Hardware (m/w)
Vorbereitung, Durchführung und Auswertung von entwicklungsbegleitenden Testfällen hinsichtlich Funktion, Umwelt und Dynamik
HOPPECKE Batterien GmbH & Co. KG - Zwickau

Ingenieur (w/m) Qualitätssicherung im Use Case Test
Erstellung und Erweiterung von Kundenszenarien aus dem Bereich des Tests und der Entwicklung von Steuergeräten
dSPACE GmbH - Paderborn

Entwicklungsingenieur Funktionsentwicklung Fahrdynamikregelsysteme (m/w)
Entwicklung von mechatronischen Fahrzeugelementen
Bertrandt Ingenieurbüro GmbH - Frankfurt am Main

weitere Angebote

Partner:


Vermarktungspartner


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, 09: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: 18.822
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2014a
     Beitrag Verfasst am: 31.03.2017, 22: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: 10.619
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 03.04.2017, 15: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
.



goMatlab ist ein Teil des goForen-Labels
goForen.de goMATLAB.de goLaTeX.de goPCB.de


 Impressum  | Nutzungsbedingungen  | Datenschutz  | Werbung/Mediadaten | Studentenversion | FAQ | goMatlab RSS Button RSS


Copyright © 2007 - 2018 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks
Partner: LabVIEWforum.de

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.