|
Art Vandelay |
Forum-Newbie
|
|
Beiträge: 3
|
|
|
|
Anmeldedatum: 26.04.11
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 26.04.2011, 15:55
Titel: Probleme mit Datentypen
|
|
Hallo allerseits,
ich hoffe ich bin am richtigen Ort mit meinem Problem. Es ist so ein Anfängerproblem, aber ich komme einfach nicht auf die richtige Matlab-Syntax...
Mein Problem: Eine einfache Subtraktion, z.B. "a-b". Dabei ist a von Typ int32 (zuvor aus einer .txt Datei in ein Cell.Array eingelesen worden und danach wurde von mir dieser Wert der Variablen a zugewiesen), b vom Typ double. Das Ergebnis ergibt immer eine ganze Zahl, was zu ungenau fuer mich ist.
Versucht habe ich schon u.a.
double(a)
cast(a,type(b))
float(a),
hat alles nichts geholfen, danach gibt mir "whos" immer noch den alten Datentyp an... Das kann doch wirklich nicht so schwer sein, aber ich stehe hier auf dem Schlauch.
Fuer eine erlösende Hilfe (Stichwort, nach dem ich in der Hilfe suchen kann oder ähnliches) wäre ich sehr dankbar.
Gruesse, Art
|
|
|
|
|
eupho |
Forum-Meister
|
|
Beiträge: 777
|
|
|
|
Anmeldedatum: 07.01.09
|
|
|
|
Wohnort: Marburg
|
|
|
|
Version: R2009b
|
|
|
|
|
|
Verfasst am: 26.04.2011, 16:05
Titel:
|
|
ans =
double
funktioniert bei mir?!
|
|
|
Art Vandelay |
Themenstarter
Forum-Newbie
|
|
Beiträge: 3
|
|
|
|
Anmeldedatum: 26.04.11
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 27.04.2011, 08:02
Titel:
|
|
Hallo Eupho,
vielen Dank fuer deine Antwort. Korrigiere mich wenn ich da sprachlich etwas durcheinander bringe, aber dein Beispiel-Code funktioniert bei mir so weit auch, aber wenn die Antwort "double" ist, sollte dann das Ergebnis von "a-b" nicht auch eine Kommazahl sein, ungerundet? Unabhängig davon, ob ich jetzt "format short" oder "format long" eingestellt habe? Das ist so eine Kleinigkeit, aber ich sehs einfach nicht, woran es liegt...
|
|
|
eupho |
Forum-Meister
|
|
Beiträge: 777
|
|
|
|
Anmeldedatum: 07.01.09
|
|
|
|
Wohnort: Marburg
|
|
|
|
Version: R2009b
|
|
|
|
|
|
Verfasst am: 27.04.2011, 08:47
Titel:
|
|
Kann es sein, dass du große Zahlen verwendest und er aus Gründen der Übersichtlichkeit die Zahl nur bei der AUSGABE rundet?
Schreib mal für dein Ergebnis c:
|
|
|
Art Vandelay |
Themenstarter
Forum-Newbie
|
|
Beiträge: 3
|
|
|
|
Anmeldedatum: 26.04.11
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 27.04.2011, 09:59
Titel:
|
|
Das funktioniert nun, danke, du hast mich auf die richtige Spur gebracht.
Es scheint also so zu sein, dass Matlab (im Gegensatz zu z.b. "format long") ein "double(a)" nicht speichert, und wenn die eigentliche Rechenoperation nicht noch in der gleichen Zeile durchgefuehrt wird, bekommt man somit nicht das gewollte Ergebnis..
Vielen Dank nochmals!
|
|
|
Jan S |
Moderator
|
|
Beiträge: 11.057
|
|
|
|
Anmeldedatum: 08.07.10
|
|
|
|
Wohnort: Heidelberg
|
|
|
|
Version: 2009a, 2016b
|
|
|
|
|
|
Verfasst am: 27.04.2011, 20:55
Titel:
|
|
Hallo Art Vandelay,
Zitat: |
Es scheint also so zu sein, dass Matlab (im Gegensatz zu z.b. "format long") ein "double(a)" nicht speichert, und wenn die eigentliche Rechenoperation nicht noch in der gleichen Zeile durchgefuehrt wird, bekommt man somit nicht das gewollte Ergebnis.
|
Diesen Satz verstehe ich nicht. Matlab rechnet so präzise wie irgend möglich und es hat keine Auswirkung, in welchen Zeilen man eine Berecjnung ausführt.
"format long" verändert nur die Anzahl der im Command-Window angezeigten Nachkommastellen, nicht den Wert der Variablen. Versuche es mit "fprintf('%16g', Wert)".
Gruß, Jan
|
|
|
EccoBravo |
Forum-Fortgeschrittener
|
|
Beiträge: 64
|
|
|
|
Anmeldedatum: 12.08.10
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 20.01.2012, 12:42
Titel: ebenfalls Problem mit Dazentypen
|
|
Hallo,
habe ein gleichartiges Problem damit und hänge mich einfach mal an.
mein Code ist folgender:
Als Ergebnis spuckt er mir immer = 1 aus.
Beim debuggen finde ich als Typ für ResX immer
ResX: 1x1 uint16 = 1
Damit komme ich nicht klar!
Erwartet hätte ich den Typ double.
Vielen Dank für Eure Hilfe
EB
_________________
Ich habe mich nicht mit Ruhm bekleckert, dafür aber andere.
Meine Hobbies,
bunt zuschauen und rhytmisch zuhören!
|
|
|
EccoBravo |
Forum-Fortgeschrittener
|
|
Beiträge: 64
|
|
|
|
Anmeldedatum: 12.08.10
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 20.01.2012, 13:47
Titel:
|
|
Es ist allles noch viel schlimmer:
ich habe etwas zum Code gefunden, so dass ResX nun Double ist.
Beim debuggen sind die Werte für Cols tatsächlich 512 und SID = 1000, soweit richtig.
AABER:
ResX ist = 1 !?!?!?!
und das obgleich ResX double ist.
Rechnet das mal mit dem Taschenrechner nach, wir bekommen dort immer etwas anderes raus!
400 / 512 * 1000 * 1000 = 0.781
Ist das nicht sonderbar ?
Der Typ von RexX ist ResX: 1x1 double,
Danke für Hilfe
EB
_________________
Ich habe mich nicht mit Ruhm bekleckert, dafür aber andere.
Meine Hobbies,
bunt zuschauen und rhytmisch zuhören!
|
|
|
Jan S |
Moderator
|
|
Beiträge: 11.057
|
|
|
|
Anmeldedatum: 08.07.10
|
|
|
|
Wohnort: Heidelberg
|
|
|
|
Version: 2009a, 2016b
|
|
|
|
|
|
Verfasst am: 21.01.2012, 18:33
Titel:
|
|
Hallo EccoBravo,
Die Zwischenergebnisse haben Integer-Werte, da sie sich nach dem Objekt mit der kleinsten Genauigkeit richten.
Lösung:
Gruß, Jan
|
|
|
EccoBravo |
Forum-Fortgeschrittener
|
|
Beiträge: 64
|
|
|
|
Anmeldedatum: 12.08.10
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 21.01.2012, 22:50
Titel:
|
|
Danke Jan,
woher soll man das denn wissen ?!?!
Nach meinem bisherigen Allgemeinwissen war
int16 * double immer double
Aber bei Matlab habe ich mich schon über ganz andere Dinge gewundert.
Ich werde mir wohl oder Übel eine Glaskugel kaufen.
Vielen Dank und einen schönen Sonntag
EB
_________________
Ich habe mich nicht mit Ruhm bekleckert, dafür aber andere.
Meine Hobbies,
bunt zuschauen und rhytmisch zuhören!
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.492
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 22.01.2012, 00:11
Titel:
|
|
|
|
|
Hallo,
Zitat: |
woher soll man das denn wissen ?!?! |
ich behaupte nun nicht, dass jeder wissen müsste, was bei Arithmetik mit gemischen Datentypen passiert. Andererseits siehst du ja aber, was das Resultat deiner Rechnung ist, und man kann ja aus Erfahrung lernen.
Wenn man nicht erst über Probleme stolpern will, um aus ihnen zu lernen, kann man das natürlich auch in der Doku nachzulesen:
http://www.mathworks.de/help/techdoc/rn/f7-998197.html#f7-1010089
Dort ist das Verhalten bei gemischten Datentypen genau beschrieben.
Zitat: |
Nach meinem bisherigen Allgemeinwissen war
int16 * double immer double |
Was numerische Berechnungen angeht, hält sich MATLAB generell an IEEE. Mich würde wundern, wenn das hier eine Ausnahme darstellt. Hast du zufällig einen Literaturverweis oder Link, die nahelegen würden, dass deine Variante der Standard ist?
Um solche Konvertierungsprobleme von vorneherein auszuschließen, ist es nicht unüblich, generell mit Doubles zu arbeiten - außer man hat gute Gründe, das nicht zu tun.
Zitat: |
ResX = double(400/Cols*1000*SID); |
Das kann nun wirklich nicht gehen: du kannst nicht aus einem Integer nachträglich die verlorene Genauigkeit zurückgewinnen. Wenn, dann musst du vorher auf Double casten, siehe Jans Beitrag.
Zitat: |
Aber bei Matlab habe ich mich schon über ganz andere Dinge gewundert.
Ich werde mir wohl oder Übel eine Glaskugel kaufen. |
Wenn Leute sich im stillen Kämmerlein über etwas wundern oder aufregen, hilft das weder den Leuten noch dabei, eventuelle Mängel im Produkt zu beheben. Ich kann also nur raten, sich bei Problemen an das Forum oder auch an den Technischen Support von MathWorks zu wenden. Für eine Glaskugel wüsste ich jedenfalls deutlich bessere Einsatzgebiete.
Grüße,
Harald
|
|
|
Jan S |
Moderator
|
|
Beiträge: 11.057
|
|
|
|
Anmeldedatum: 08.07.10
|
|
|
|
Wohnort: Heidelberg
|
|
|
|
Version: 2009a, 2016b
|
|
|
|
|
|
Verfasst am: 22.01.2012, 01:32
Titel:
|
|
|
|
|
Hallo Harald,
Dein Link zur Dokumentation betrifft ausgerechnet die Releasenotes, in denen Änderungen des Verhaltens beschrieben werden:
Wenn sich das Verhalten aber zwischen den Releases geändert hat, scheint es sich doch nicht soo eindeutig an die IEEE-Regeln zu halten - besser: gehalten zu haben, denn die Änderung betrifft Matlab R14 (Juni 2004).
Hier sind zwei weitere Links, die das Thema genauer aufgreifen:
http://www.mathworks.com/company/ne.....igest/july04/intmath.html
http://www.mathworks.com/help/techd.....og/f2-12135.html#f2-52790
Der Technische Support steht Studenten nur eingeschränkt zur Verfügung. Die Dokumentation ist aber ohne Frage eine sehr gute Quelle zu Fragen betreffend der Arithmetik. Eine solch umfangreiche Sprache wie Matlab läßt sich nur mit ausgiebigem Studium der Dokumentation meistern.
Was immer ihr mit den Glaskugeln auch machen wollt - dies ist ein deterministisches Forum und Glaskugeln müssen bei den Moderatoren abgegeben werden!
Gruß, Jan
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.492
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 22.01.2012, 10:21
Titel:
|
|
Hallo Jan,
danke für die in der Tat besseren Links.
Ich behaupte mal, es gibt nicht allzu viele Leute, die noch Versionen vor R14 nutzen. Da würde ich dann schon empfehlen, auf eine neuere Version zu wechseln. Wer dies bewusst nicht tut, dürfte sehr gute Gründe dafür haben und wird sich mit eventuellen Schwächen dieses Releases inzwischen abgefunden haben.
Auf den ersten Blick sehe ich nicht, ob diese Änderung nur die interne Durchführung der Operationen beeinflusst oder ob sich tatsächlich die Datentypen der Ergebnisse geändert haben. Meine Vermutung wäre ersteres.
Grüße,
Harald
|
|
|
Jan S |
Moderator
|
|
Beiträge: 11.057
|
|
|
|
Anmeldedatum: 08.07.10
|
|
|
|
Wohnort: Heidelberg
|
|
|
|
Version: 2009a, 2016b
|
|
|
|
|
|
Verfasst am: 22.01.2012, 17:58
Titel:
|
|
|
|
|
Hallo Harald,
Zitat: |
Ich behaupte mal, es gibt nicht allzu viele Leute, die noch Versionen vor R14 nutzen. |
Ja, Harald, ich weiß. Ich dachte ich wäre der einzige, der noch aus Gründen der 100%igen Kompatibilität mit 6.5 arbeiten muss. Dort führt die Berechnung übrigens zu:
Während Arithmetic mit (U)int8/16/32 mit R14 hinzukam, wurde (U)INT64 erst vor kurzen nachgerüstet - verblüffenderweise. Die Gründe dafür findet man wohl in seiner Glaskugel... :-)
Ich frage mich, unter welchem Betriebssystem Art Vandelay Matlab 5.3 laufen läßt. Unter Windows7 ist das nicht trivial.
Nebenbei enthält 5.3 eine erhebliche Menge an Bugs, so dass ein Update auf 6.5 die Stabilität schonmal deutlich erhöhen würde, besser wäre aber 7.1 (R14SP3). Die modernen Matlab Versionen helfen aber durch MLINT sehr viele Fehler in den Benutzer-definierten Funktionen zu vermeiden. 99.9% der Funktionen sind stabil, aber jedes Release hat ein paar saftige Bugs. Leider sorgt die aktuelle update-by-upgrade-Strategie dafür, dass mit der Behebung der einen Bugs wieder andere neue dazu kommen.
Eine Long-Term-Support-Version, bei der über 3 Jahre alle Bugs behoben würden, wäre eine wirklich gute Idee für eine Software-Platform, die zur Berechnung sicherheitsrelevanter geeignet sein soll.
Gruß, Jan
|
|
|
EccoBravo |
Forum-Fortgeschrittener
|
|
Beiträge: 64
|
|
|
|
Anmeldedatum: 12.08.10
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 24.01.2012, 17:14
Titel:
|
|
Hallo und Danke,
habe nicht geglaubt, dass ich mit meiner "Glaskugel" so viel ... vom Zaun brechen würde!
Selbst komme ich aus der Delphi-Ecke und habe dort über 20 Jahre deterministisches Denken gelernt.
ReleaseNotes und Standards hin und her, Matlab ist ein Werzeug für uns Menschen und wir Menschen sind kein Tool von MatLab!
Für mich bleibt das Doppelte eines Double wiederum ein Double und das Doppelte ist ein Integer!
Übringens arbeite ich mit MatLab R2010a 7.10.0.499 auf Win XP 32.
Ich bin nicht verärgert oder beleidigt, noch zweifle ich an mir, ich möchte dieses Typenproblem nur ordentlich ausdiskutieren und etwas dazu lernen.
Danke
EB
_________________
Ich habe mich nicht mit Ruhm bekleckert, dafür aber andere.
Meine Hobbies,
bunt zuschauen und rhytmisch zuhören!
|
|
|
|
Gehe zu Seite 1, 2 Weiter
|
Einstellungen und Berechtigungen
|
|
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
| 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.
|
|