Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   
Bücher:

Fachkräfte:
Softwareentwickler (m/w) für automatische Codegenerierung
Softwareentwicklung mit MATLAB/Simulink und dSPACE TargetLink im Bereich Fahrwerkregelsysteme
Elektronische Fahrwerksysteme GmbH - Ingolstadt

Entwicklungsingenieur (m/w) für modellbasierte Softwareentwicklung
Modellbasierte Softwareentwicklung mit MATLAB/Simulink und dSPACE TargetLink
Elektronische Fahrwerksysteme GmbH - Ingolstadt

Test-Ingenieur (m/w) für Resimulation
Implementierung, Integration und Anpassung von sogenannten ADTF-Filtern
Automotive Safety Technologies GmbH - Ingolstadt

Resident-Ingenieur (w/m) Hardware-in-the-Loop-Simulation
Inbetriebnahme und Software-Anpassungen der HIL-Systeme
dSPACE GmbH - Wolfsburg

Entwicklungsingenieur (m/w) für Fahrdynamikregelsysteme
Entwicklung der für die Fahrdynamik relevanten Funktionen
Elektronische Fahrwerksysteme GmbH - Ingolstadt

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: 56
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: 17.537
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2014a
     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: 10.481
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 vorhande
  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 - 2017 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.