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

Probleme mit Datentypen

 

Art Vandelay
Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 26.04.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.04.2011, 15:55     Titel: Probleme mit Datentypen
  Antworten mit Zitat      
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
Private Nachricht senden Benutzer-Profile anzeigen


eupho
Forum-Meister

Forum-Meister


Beiträge: 777
Anmeldedatum: 07.01.09
Wohnort: Marburg
Version: R2009b
     Beitrag Verfasst am: 26.04.2011, 16:05     Titel:
  Antworten mit Zitat      
Code:
a = int32(123423);
b = double(1234.1234);
class(double(a) - b)

ans =

double

funktioniert bei mir?!
Private Nachricht senden Benutzer-Profile anzeigen
 
Art Vandelay
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 26.04.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.04.2011, 08:02     Titel:
  Antworten mit Zitat      
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...
Private Nachricht senden Benutzer-Profile anzeigen
 
eupho
Forum-Meister

Forum-Meister


Beiträge: 777
Anmeldedatum: 07.01.09
Wohnort: Marburg
Version: R2009b
     Beitrag Verfasst am: 27.04.2011, 08:47     Titel:
  Antworten mit Zitat      
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:

Code:
a = int32(123423);
b = double(1234.1234);
c = double(a) - b;
num2str(c, '%.5f')
Private Nachricht senden Benutzer-Profile anzeigen
 
Art Vandelay
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 26.04.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.04.2011, 09:59     Titel:
  Antworten mit Zitat      
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!
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: 27.04.2011, 20:55     Titel:
  Antworten mit Zitat      
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)".
Code:
a = pi
format short g
a
format long g
a

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
EccoBravo
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 64
Anmeldedatum: 12.08.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.01.2012, 12:42     Titel: ebenfalls Problem mit Dazentypen
  Antworten mit Zitat      
Hallo,

habe ein gleichartiges Problem damit und hänge mich einfach mal an.

mein Code ist folgender:

Code:
global ResX;

% Cols (int16) und SID  (double) sind bekannt

...

ResX = 400/Cols*1000*SID;

...


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!
Private Nachricht senden Benutzer-Profile anzeigen
 
EccoBravo
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 64
Anmeldedatum: 12.08.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.01.2012, 13:47     Titel:
  Antworten mit Zitat      
Es ist allles noch viel schlimmer:

ich habe etwas zum Code gefunden, so dass ResX nun Double ist.

Code:
global ResX;

% Cols (int16) und SID  (double) sind bekannt

...

ResX = double(400/Cols*1000*SID);

...  


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!
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: 21.01.2012, 18:33     Titel:
  Antworten mit Zitat      
Hallo EccoBravo,

Die Zwischenergebnisse haben Integer-Werte, da sie sich nach dem Objekt mit der kleinsten Genauigkeit richten.
Lösung:
Code:
global ResX;
% Cols (int16) und SID  (double) sind bekannt
ResX = 400/double(Cols)*1000*SID;

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
EccoBravo
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 64
Anmeldedatum: 12.08.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.01.2012, 22:50     Titel:
  Antworten mit Zitat      
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!
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: 22.01.2012, 00:11     Titel:
  Antworten mit Zitat      
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
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: 22.01.2012, 01:32     Titel:
  Antworten mit Zitat      
Hallo Harald,

Dein Link zur Dokumentation betrifft ausgerechnet die Releasenotes, in denen Änderungen des Verhaltens beschrieben werden:
Zitat:
http://www.mathworks.de/help/techdoc/rn/f7-998197.html#f7-1010089

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
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: 22.01.2012, 10:21     Titel:
  Antworten mit Zitat      
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
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: 22.01.2012, 17:58     Titel:
  Antworten mit Zitat      
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:
Code:
>> 400/int16(5)*1000*double(3)
??? Error using ==> /
Function '/' is not defined for values of class 'int16'.

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
Private Nachricht senden Benutzer-Profile anzeigen
 
EccoBravo
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 64
Anmeldedatum: 12.08.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.01.2012, 17:14     Titel:
  Antworten mit Zitat      
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!
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

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.