octave-maintainers
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[CHANGESET] Re: [OctDev] Genetic algorithms in Octave


From: David Bateman
Subject: [CHANGESET] Re: [OctDev] Genetic algorithms in Octave
Date: Fri, 14 Mar 2008 18:54:37 +0100
User-agent: Thunderbird 2.0.0.12 (X11/20080306)

Luca Favatella wrote:
> I found these functions in the Matlab doc:
>
> hex2num
> http://www.mathworks.com/access/helpdesk/help/techdoc/index.html?/access/helpdesk/help/techdoc/ref/hex2num.html&http://www.mathworks.com/access/helpdesk/help/techdoc/ref/f16-6011.html
>
> num2hex
> http://www.mathworks.com/access/helpdesk/help/techdoc/index.html?/access/helpdesk/help/techdoc/ref/num2hex.html&http://www.mathworks.com/access/helpdesk/help/techdoc/ref/f16-6011.html
>
>
>   

What about the attached. Is this is accepted in to the octave-core could
you adapt your code to use num2hex and hex2num instead? We should then
think about getting the code on to octave-forge.

D.

# HG changeset patch
# User David Bateman <address@hidden>
# Date 1205517018 -3600
# Node ID 298b926b00e0402b12d55738a8f6c2a0d56aeec3
# Parent  33c8aade7c453c1ae32f46d69298840024e72af6
Add the num2hex and hex2num functions

diff --git a/doc/ChangeLog b/doc/ChangeLog
--- a/doc/ChangeLog
+++ b/doc/ChangeLog
@@ -1,3 +1,7 @@ 2008-03-12  David Bateman  <address@hidden
+2008-03-14  David Bateman  <address@hidden>
+
+       * interpreter/strings.txi: Document hex2num, num2hex.
+       
 2008-03-12  David Bateman  <address@hidden>
 
        * interpreter/io.txi: Document dlmread, dlmwrite, csvread and
diff --git a/doc/interpreter/strings.txi b/doc/interpreter/strings.txi
--- a/doc/interpreter/strings.txi
+++ b/doc/interpreter/strings.txi
@@ -297,6 +297,10 @@ hex2dec ("FF")
 
 @DOCSTRING(base2dec)
 
address@hidden(num2hex)
+
address@hidden(hex2num)
+
 @DOCSTRING(str2double)
 
 @DOCSTRING(strjust)
diff --git a/src/ChangeLog b/src/ChangeLog
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,8 +1,13 @@ 2008-03-12  David Bateman  <address@hidden
+2008-03-14  David Bateman  <address@hidden>
+
+       * DLD-FUNCTIONS/hex2num.cc: New function
+       * Makefile.in (DLD_XSRC): Add hex2num.cc.
+
 2008-03-12  David Bateman  <address@hidden>
 
        * DLD-FUNCTIONS/dlmread.cc: Function ported from octave forge. Add
        spreadsheet style ranges.
-       * MAkefile.in (DLD_XSRC): Add dlmread.cc.
+       * Makefile.in (DLD_XSRC): Add dlmread.cc.
 
 2008-03-11  John W. Eaton  <address@hidden>
 
diff --git a/src/DLD-FUNCTIONS/hex2num.cc b/src/DLD-FUNCTIONS/hex2num.cc
new file mode 100644
--- /dev/null
+++ b/src/DLD-FUNCTIONS/hex2num.cc
@@ -0,0 +1,167 @@
+/*
+
+Copyright (C) 2008 David Bateman
+
+This file is part of Octave.
+
+Octave is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+Octave is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with Octave; see the file COPYING.  If not, see
+<http://www.gnu.org/licenses/>.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <algorithm>
+
+#include "defun-dld.h"
+#include "error.h"
+#include "gripes.h"
+#include "oct-obj.h"
+#include "utils.h"
+
+DEFUN_DLD (hex2num, args, ,
+  "-*- texinfo -*-\n\
address@hidden {Loadable Function} address@hidden =} hex2num (@var{s})\n\
+Typecast the 16 character hexadecimal character matrix to an IEEE 754\n\
+double precision number. If fewer than 16 characters are given the\n\
+strings are right padded with '0' characters.\n\
+\n\
+Given a string matrix, @code{hex2num} treats each row as a separate\n\
+number.\n\
+\n\
address@hidden
+hex2num ([\"4005bf0a8b145769\";\"4024000000000000\"])\n\
address@hidden [2.7183; 10.000]\n\
address@hidden example\n\
address@hidden, hex2dec, dec2hex}\n\
address@hidden deftypefn")
+{
+  int nargin = args.length ();
+  octave_value retval;
+
+  if (nargin != 1)
+    print_usage ();
+  else
+    {
+      const charMatrix cmat = args(0).char_matrix_value ();
+
+      if (cmat.columns () > 16)
+       error ("hex2num: expecting no more than a 16 character string");
+      else if (! error_state)
+       {
+         octave_idx_type nr = cmat.rows ();
+         octave_idx_type nc = cmat.columns ();
+         ColumnVector m (nr);
+
+         for (octave_idx_type i = 0; i < nr; i++)
+           {
+             uint64_t num = 0;
+             for (octave_idx_type j = 0; j < nc; j++)
+               {
+                 unsigned char ch = cmat.elem (i, j);
+
+                 if (isxdigit (ch))
+                   {
+                     num <<= 4;
+                     if (ch >= 'a')
+                       num += static_cast<uint64_t> (ch - 'a' + 10);
+                     else if (ch >= 'A')
+                       num += static_cast<uint64_t> (ch - 'A' + 10);
+                     else
+                       num += static_cast<uint64_t> (ch - '0');
+                   }
+                 else
+                   {
+                     error ("hex2num: illegal character found in string");
+                     break;
+                   }
+               }
+
+             if (error_state)
+               break;
+             else
+               {
+                 if (nc < 16)
+                   num <<= (16 - nc) * 4;
+
+                 m (i) = *reinterpret_cast<double *>(&num);
+
+               }
+           }
+
+         if (! error_state)
+           retval =  m;
+       }
+    }
+
+  return retval;
+}
+
+DEFUN_DLD (num2hex, args, ,
+  "-*- texinfo -*-\n\
address@hidden {Loadable Function} address@hidden =} num2hex (@var{n})\n\
+Typecast a double precision number or vector to a 16 character hexadecimal\n\
+string of the IEEE 754 representation of the number. For example\n\
+\n\
address@hidden
+num2hex ([-1, 1, e, Inf, NaN, NA]);\n\
address@hidden \"bff0000000000000\n\
+    3ff0000000000000\n\
+    4005bf0a8b145769\n\
+    7ff0000000000000\n\
+    fff8000000000000\n\
+    7ff00000000007a2\"\n\
address@hidden example\n\
address@hidden, hex2dec, dec2hex}\n\
address@hidden deftypefn")
+{
+  int nargin = args.length ();
+  octave_value retval;
+
+  if (nargin != 1)
+    print_usage ();
+  else
+    {
+      const ColumnVector v (args(0).vector_value ());
+
+      if (! error_state)
+       {
+         octave_idx_type nr = v.length ();
+         charMatrix m (nr, 16);
+         const double *pv = v.fortran_vec ();
+
+         for (octave_idx_type i = 0; i < nr; i++)
+           {
+             const uint64_t num = *reinterpret_cast<const uint64_t *> (pv++);
+             for (octave_idx_type j = 0; j < 16; j++)
+               {
+                 unsigned char ch = 
+                   static_cast<char> (num >> ((15 - j) * 4) & 0xF);
+                 if (ch >= 10)
+                   ch += 'a' - 10;
+                 else
+                   ch += '0';
+
+                 m.elem (i, j) = ch;
+               }
+           }
+         
+         retval = octave_value (m, true);
+       }
+    }
+
+  return retval;
+}
diff --git a/src/Makefile.in b/src/Makefile.in
--- a/src/Makefile.in
+++ b/src/Makefile.in
@@ -67,7 +67,7 @@ DLD_XSRC := balance.cc besselj.cc betain
        dasrt.cc dassl.cc det.cc dispatch.cc dlmread.cc dmperm.cc eig.cc \
        expm.cc fft.cc fft2.cc fftn.cc fftw.cc filter.cc find.cc fsolve.cc \
        gammainc.cc gcd.cc getgrent.cc getpwent.cc getrusage.cc \
-       givens.cc hess.cc inv.cc kron.cc lsode.cc \
+       givens.cc hess.cc hex2num.cc inv.cc kron.cc lsode.cc \
        lu.cc luinc.cc matrix_type.cc md5sum.cc minmax.cc pinv.cc qr.cc \
        quad.cc qz.cc rand.cc regexp.cc schur.cc sparse.cc \
        spparms.cc sqrtm.cc svd.cc syl.cc symrcm.cc symbfact.cc \

reply via email to

[Prev in Thread] Current Thread [Next in Thread]