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

num2hex bzw. dec2hex

 

laura84
Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 06.11.09
Wohnort: München
Version: ---
     Beitrag Verfasst am: 06.11.2009, 11:40     Titel: num2hex bzw. dec2hex
  Antworten mit Zitat      
Hallo,

ich hätte mal eine Frage zu den Funktionen "num2hex" und "dec2hex". Ich habe Werte die durch eine Sinusfunktion zu stande gekommen sind.

Code:
v_sin =

         0
    0.3827
    0.7071
    0.9239
    1.0000
    0.9239
    0.7071
    0.3827
    0.0000
   -0.3827
   -0.7071
   -0.9239
   -1.0000
   -0.9239
   -0.7071
   -0.3827
   -0.0000


Diese Werte möchte ich nun, jeden Einzelnen, in Hexadezimal Code wandeln. Dazu wollte ich eigentlich die "num2hex" Funktion nutzen, aber die gibt für eine 1 ja 3f800000 (bei single) aus. Das ist meiner Meinung nach falsch. Für eine 1 sollte man auch 00000001 raus bekommen. Kann mir jemand erklären warum die num2hex Funktion die falschen Werte ausgibt? Es steht ja sogar so in der Beschreibung, aber ich verstehe nicht was das soll.

Nun habe ich mir gedacht, dann nutze ich halt dec2hex, aber da bekomme ich immer eine Fehlermeldung.

??? Error using ==> dec2hex at 27
First argument must contain non-negative integers.


Kann ich dec2hex irgendwie nutzen auch mit negativen Zahlen und Kommazahlen?

Beste Grüße
Laura
Private Nachricht senden Benutzer-Profile anzeigen


derOli
Forum-Meister

Forum-Meister


Beiträge: 579
Anmeldedatum: 19.03.08
Wohnort: Leipzig
Version: 2010a
     Beitrag Verfasst am: 06.11.2009, 13:04     Titel:
  Antworten mit Zitat      
Hi,

num2hex --> floating point
dec2hex --> unsigned integers

Wie stellst du dir die Konvertierung denn vor?

Viele Grüße,

der Oli
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 06.11.2009, 13:05     Titel:
  Antworten mit Zitat      
Hallo,

num2hex übersetzt schon in richtige Form.
Das spezielle Form nach IEEE 754.
schaue mal hier rein, hier wird Darstellung erklärt:

http://web.bvu.edu/faculty/traylor/....._point_representation.htm

dec2hex ist nur für Natürliche Positive Zahlen gedacht.
Wenn du es nutzen willst muss du deine Zahlen irgendwie auf Natürliche Positive Zahlen normieren.
Private Nachricht senden Benutzer-Profile anzeigen
 
laura84
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 06.11.09
Wohnort: München
Version: ---
     Beitrag Verfasst am: 09.11.2009, 15:12     Titel:
  Antworten mit Zitat      
Hallo,

danke für eure Antworten. Ich habe jetzt auch eine Lösung gefunden, wie ich die richtigen hex Werte bekomme. Diese spezielle Form nach IEEE 754 war für mich nämlich nicht zu gebrauchen.

Nun habe ich aber noch ein kleines anderes Problem. Ich möchte von den hex Werten die in einem Vektor stehen jeweils einen festen hex Wert abziehen, wenn ich das mache bekomme ich aber immer eine Berechnung die dann dezimal Werte ausgibt. Kann mir da jemand helfen?

So sieht es vorher aus:

Code:
hex_werte =

2710
3603
42AF
4B27
4E20
4B27
42AF
3603
2710
181D
0B71
02F9
0000
02F9
0B71
181D
2710


Und ich möchte von jedem dieser Werte den hex Wert 2710 abziehen, wenn ich das mache, bekomme ich aber immer dieses Ergebnis:

Code:
hex_werte1=hex_werte-2710;


Code:
hex_werte1 =

       -2660       -2655       -2661       -2662
       -2659       -2656       -2662       -2659
       -2658       -2660       -2645       -2640
       -2658       -2644       -2660       -2655
       -2658       -2641       -2660       -2662
       -2658       -2644       -2660       -2655
       -2658       -2660       -2645       -2640
       -2659       -2656       -2662       -2659
       -2660       -2655       -2661       -2662
       -2661       -2654       -2661       -2642
       -2662       -2644       -2655       -2661
       -2662       -2660       -2640       -2653
       -2662       -2662       -2662       -2662
       -2662       -2660       -2640       -2653
       -2662       -2644       -2655       -2661
       -2661       -2654       -2661       -2642
       -2660       -2655       -2661       -2662


Ich habe es auch schon so probiert:

Code:
hex_werte1=hex_werte-(dec2hex(10000))


Das funktioniert aber auch nicht. Selbst wenn ich "format hex" mache klappt es nicht.

Hat jemand einen Tip für mich wie man im Hexadezimal System rechnen kann?

Grüße,
Laura
Private Nachricht senden Benutzer-Profile anzeigen
 
derOli
Forum-Meister

Forum-Meister


Beiträge: 579
Anmeldedatum: 19.03.08
Wohnort: Leipzig
Version: 2010a
     Beitrag Verfasst am: 09.11.2009, 15:32     Titel:
  Antworten mit Zitat      
Hi,

wie hast du es denn jetzt gelöst? D.h. wie transformierst du denn die Daten jetzt. Richtig und Falsch liegt da wohl im Auge des Betrachters.

Die Hex Zahlen sind ja nur String arrays. D.h. die musst du nochmal zum Beispiel mit hex2dex einzeln zurückwandeln um die dann voneinander abzuziehen. Z.B. so:

Code:


Aber wenn du die jetzt anders konvertierst geht das natürlich nicht mehr so.

Viele Grüße,

der Oli
Private Nachricht senden Benutzer-Profile anzeigen
 
laura84
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 06.11.09
Wohnort: München
Version: ---
     Beitrag Verfasst am: 09.11.2009, 15:50     Titel:
  Antworten mit Zitat      
Hi,

also ich addiere zu meinen Sinus Werten einfach 1 und multipliziere sie auch noch mit 10000, dann schneide ich die Nachkomma-Stellen ab. So bekomme ich nur positive integer Werte und kann dann diese Werte ja ganz einfach mit dec2hex umwandeln. Jetzt wollte ich die 10000 aber wieder abziehen damit ich meine eigentlichen Werte wieder bekomme.

Dein Vorschlag erst wieder alles in dezimal umzurechnen funktioniert dann ja leider nicht, weil sonst würde er ja wieder Kommazahlen umrechnen müssen und das war ja das Problem von Anfang an.

Hier mal mein kompletter Code zum besseren Verständnis:

Code:
clear all;
format long

clc
c=1;
a=10000;
w=2*pi;
f=10;
n=(0.1/16);
time=(0:n:0.1)';
v_sin=a.*(c+sin(w.*f.*time));

out = cell(17,1);
for i=1:17;
    out{i} = eval(sprintf('%0.0f',v_sin(i)));
end

out=cell2mat(out);

hex_werte=dec2hex(single(out))


Und diese Berechnung bräuchte ich eigentlich noch:

Code:
hex_werte1=hex_werte-(dec2hex(10000))


Grüße,
Laura
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 09.11.2009, 18:54     Titel:
  Antworten mit Zitat      
Hallo, Kommazahlen würdest du ja hier nicht bekommen.
Aber Negative Zahlen, wie willst du sie dann darstellen?
Private Nachricht senden Benutzer-Profile anzeigen
 
laura84
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 06.11.09
Wohnort: München
Version: ---
     Beitrag Verfasst am: 10.11.2009, 10:28     Titel:
  Antworten mit Zitat      
Hallo,

ich brauche eine Look-Up-Table, die Ausgabe sieht dann momentan so aus:

Code:
SINUS_LUT = {
0x2710, 0x3603, 0x42AF, 0x4B27,
0x4E20, 0x4B27, 0x42AF, 0x3603,
0x2710, 0x181D, 0x0B71, 0x02F9,
0x0000, 0x02F9, 0x0B71, 0x181D,
0x2710
};


Gibt es denn wirklich keine Möglichkeit in Matlab im hexadezimal System zu rechnen? Ich arbeite noch nicht sehr lange mit Matlab und habe deswegen so gut wie keine Erfahrungen, aber ich dachte dass es sowas schon können sollte.

Gruß,
Laura
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 10.11.2009, 14:53     Titel:
  Antworten mit Zitat      
Nein, es gibt dafür keine Funktionen.

So ungefähr muss du dann für dich eigene Funktion schreiben,
wenn du möchtest, dass Operationen direkt an HEX durchgeführt werden.
Und wie du siehst es läuft kein Weg über hex2dec oder dec2hex vorbei
Code:

function res = hexfun(fun,op1,op2)
op1     = hex2dec(op1);
op2     = hex2dec(op2);

switch(fun)
   case 'plus'
      res = op1+op2;
   case 'minus'
      res = op1-op2;
   case 'times'
      res = op1*op2;
   case 'divide'
      res = op1/op2;
end


max_size = intmax('uint32');

if res < 0
  res = max_size + res;
end

if res > max_size
  res = res - max_size;
end
res = sprintf('%8X', uint32(res));
 
Private Nachricht senden Benutzer-Profile anzeigen
 
laura84
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 06.11.09
Wohnort: München
Version: ---
     Beitrag Verfasst am: 10.11.2009, 15:14     Titel:
  Antworten mit Zitat      
Vielen Dank für deine Antwort, ich muss allerdings zugeben dass ich nicht sehr viel damit anfangen kann. Ich habe den Code mal in ein m File kopiert, aber er wird nicht ausgeführt, hängt schon an der ersten Funktion. Ich denke mal du meinst mit "op1" und "op2" die Operanden, oder? Wenn ich die gleich zu Anfang wieder in dec umwandle bekomme ich am Ende ja doch auch wieder negative Werte und kann sie nicht wieder in hex umrechnen, oder? Ich versteh den Code den du geschrieben hast leider nicht wirklich, also auch nicht was er machen soll. Sorry.
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 10.11.2009, 15:46     Titel:
  Antworten mit Zitat      
1) Stimmt op1 und op2 sind Operanden

2) Negative Zahlen werden abgefangen,
muss aber aufpassen, dass diese in max Bereich liegen(zugrunde habe ich Idee der Integer Darstellung aus C )
z.B '0' Minus '1' ergibt 'FFFFFFFE'

Aufruf:
Code:

res = hexfun('minus',  '270F',  '2700')
res = hexfun('plus',  '270F',  '2700')
res = hexfun('times',  '16',  '2')
res = hexfun('divide',  '16',  '2')
 



Ändere noch die Zeile sollen Nullen statt Leerzeichen geschrieben werden.
Code:

res = sprintf('%08X', uint32(res));
 
Private Nachricht senden Benutzer-Profile anzeigen
 
laura84
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 06.11.09
Wohnort: München
Version: ---
     Beitrag Verfasst am: 10.11.2009, 16:08     Titel:
  Antworten mit Zitat      
Was mache ich falsch? Ich bekomme ständig Fehlermeldungen.

z.B. ??? Input argument "op1" is undefined.

Hier mal der Code wie ich ihn in meinem m File stehen habe:

Code:
function res = hexfun(fun,op1,op2)
op1     = hex2dec (op1);
op2     = hex2dec(op2);

switch(fun)
   case 'plus'
      res = op1+op2;
   case 'minus'
      res = op1-op2;
   case 'times'
      res = op1*op2;
   case 'divide'
      res = op1/op2;
end


max_size = intmax('uint32');

if res < 0
  res = max_size + res;
end

if res > max_size
  res = res - max_size;
end
res = sprintf('%08X', uint32(res));


res = hexfun('minus',  '0',  '1')


Ich habe zu deinem ja nur das geändert was du geschrieben hast.
Private Nachricht senden Benutzer-Profile anzeigen
 
derOli
Forum-Meister

Forum-Meister


Beiträge: 579
Anmeldedatum: 19.03.08
Wohnort: Leipzig
Version: 2010a
     Beitrag Verfasst am: 10.11.2009, 16:14     Titel:
  Antworten mit Zitat      
Hi, hast du die Funktion so wie denny sie geschrieben hat als extra Datei mit dem Namen hexfun.m gespeichert?

Viele Grüße,

der Oli
Private Nachricht senden Benutzer-Profile anzeigen
 
laura84
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 06.11.09
Wohnort: München
Version: ---
     Beitrag Verfasst am: 10.11.2009, 16:30     Titel:
  Antworten mit Zitat      
Oh man, nein natürlich nicht.

Vielen Dank jetzt funktioniert es auch.

Danke euch allen für die Mühe.
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 - 2025 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.