[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [OctDev] [CHANGESET] Re: Genetic algorithms in Octave
From: |
David Bateman |
Subject: |
Re: [OctDev] [CHANGESET] Re: Genetic algorithms in Octave |
Date: |
Mon, 17 Mar 2008 00:46:29 +0100 |
User-agent: |
Thunderbird 2.0.0.12 (X11/20080306) |
David Bateman wrote:
> 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.
>
>
Here is another version that adds a couple of tests.
D.
# HG changeset patch
# User David Bateman <address@hidden>
# Date 1205711024 -3600
# Node ID 8ae77436d7e0c5fccc86bd47b6aa6d7ed213417d
# Parent a2454934ea5b8e204d37e468c2598977e18d6b70
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,3 +1,8 @@ 2008-03-13 John W. Eaton <address@hidden
+2008-03-16 David Bateman <address@hidden>
+
+ * DLD-FUNCTIONS/hex2num.cc: New function
+ * Makefile.in (DLD_XSRC): Add hex2num.cc.
+
2008-03-13 John W. Eaton <address@hidden>
* ov-usr-fcn.cc (octave_user_function::octave_user_function):
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,183 @@
+/*
+
+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;
+}
+
+/*
+
+%!assert (hex2num(['c00';'bff';'000';'3ff';'400']),[-2:2]')
+
+ */
+
+
+
+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;
+}
+
+/*
+
+%!assert (num2hex
(-2:2),['c000000000000000';'bff0000000000000';'0000000000000000';'3ff0000000000000';'4000000000000000'])
+
+ */
+
+
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 \