annotate scripts/strings/str2double.m @ 7031:120f3135952f

[project @ 2007-10-15 15:30:03 by jwe]
author jwe
date Mon, 15 Oct 2007 15:31:21 +0000
parents a1dbe9d80eee
children 0c11c6907c38
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7017
a1dbe9d80eee [project @ 2007-10-12 21:27:11 by jwe]
jwe
parents: 7016
diff changeset
1 ## Copyright (C) 2004, 2005, 2006, 2007 by Alois Schloegl
5185
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
2 ##
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
3 ## This file is part of Octave.
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
4 ##
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
5 ## Octave is free software; you can redistribute it and/or modify it
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
6 ## under the terms of the GNU General Public License as published by
7016
93c65f2a5668 [project @ 2007-10-12 06:40:56 by jwe]
jwe
parents: 5920
diff changeset
7 ## the Free Software Foundation; either version 3 of the License, or (at
93c65f2a5668 [project @ 2007-10-12 06:40:56 by jwe]
jwe
parents: 5920
diff changeset
8 ## your option) any later version.
5185
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
9 ##
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
10 ## Octave is distributed in the hope that it will be useful, but
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
11 ## WITHOUT ANY WARRANTY; without even the implied warranty of
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
12 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
13 ## General Public License for more details.
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
14 ##
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
15 ## You should have received a copy of the GNU General Public License
7016
93c65f2a5668 [project @ 2007-10-12 06:40:56 by jwe]
jwe
parents: 5920
diff changeset
16 ## along with Octave; see the file COPYING. If not, see
93c65f2a5668 [project @ 2007-10-12 06:40:56 by jwe]
jwe
parents: 5920
diff changeset
17 ## <http://www.gnu.org/licenses/>.
5185
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
18
5187
e58bbd2b9c94 [project @ 2005-03-03 07:20:32 by jwe]
jwe
parents: 5185
diff changeset
19 ## -*- texinfo -*-
e58bbd2b9c94 [project @ 2005-03-03 07:20:32 by jwe]
jwe
parents: 5185
diff changeset
20 ## @deftypefn {Function File} {[@var{num}, @var{status}, @var{strarray}] =} str2double (@var{str}, @var{cdelim}, @var{rdelim}, @var{ddelim})
e58bbd2b9c94 [project @ 2005-03-03 07:20:32 by jwe]
jwe
parents: 5185
diff changeset
21 ## Convert strings into numeric values.
5184
d35c5104ffbe [project @ 2005-03-03 06:37:19 by jwe]
jwe
parents: 5183
diff changeset
22 ##
5187
e58bbd2b9c94 [project @ 2005-03-03 07:20:32 by jwe]
jwe
parents: 5185
diff changeset
23 ## @code{str2double} can replace @code{str2num}, but avoids the use of
e58bbd2b9c94 [project @ 2005-03-03 07:20:32 by jwe]
jwe
parents: 5185
diff changeset
24 ## @code{eval} on unknown data.
5184
d35c5104ffbe [project @ 2005-03-03 06:37:19 by jwe]
jwe
parents: 5183
diff changeset
25 ##
5187
e58bbd2b9c94 [project @ 2005-03-03 07:20:32 by jwe]
jwe
parents: 5185
diff changeset
26 ## @var{str} can be the form @samp{[+-]d[.]dd[[eE][+-]ddd]} in which
e58bbd2b9c94 [project @ 2005-03-03 07:20:32 by jwe]
jwe
parents: 5185
diff changeset
27 ## @samp{d} can be any of digit from 0 to 9, and @samp{[]} indicate
e58bbd2b9c94 [project @ 2005-03-03 07:20:32 by jwe]
jwe
parents: 5185
diff changeset
28 ## optional elements.
e58bbd2b9c94 [project @ 2005-03-03 07:20:32 by jwe]
jwe
parents: 5185
diff changeset
29 ##
e58bbd2b9c94 [project @ 2005-03-03 07:20:32 by jwe]
jwe
parents: 5185
diff changeset
30 ## @var{num} is the corresponding numeric value. If the conversion
e58bbd2b9c94 [project @ 2005-03-03 07:20:32 by jwe]
jwe
parents: 5185
diff changeset
31 ## fails, status is -1 and @var{num} is NaN.
5184
d35c5104ffbe [project @ 2005-03-03 06:37:19 by jwe]
jwe
parents: 5183
diff changeset
32 ##
5187
e58bbd2b9c94 [project @ 2005-03-03 07:20:32 by jwe]
jwe
parents: 5185
diff changeset
33 ## @var{status} is 0 if the conversion was successful and -1 otherwise.
e58bbd2b9c94 [project @ 2005-03-03 07:20:32 by jwe]
jwe
parents: 5185
diff changeset
34 ##
e58bbd2b9c94 [project @ 2005-03-03 07:20:32 by jwe]
jwe
parents: 5185
diff changeset
35 ## @var{strarray} is a cell array of strings.
e58bbd2b9c94 [project @ 2005-03-03 07:20:32 by jwe]
jwe
parents: 5185
diff changeset
36 ##
e58bbd2b9c94 [project @ 2005-03-03 07:20:32 by jwe]
jwe
parents: 5185
diff changeset
37 ## Elements which are not defined or not valid return NaN and the
e58bbd2b9c94 [project @ 2005-03-03 07:20:32 by jwe]
jwe
parents: 5185
diff changeset
38 ## @var{status} becomes -1.
5184
d35c5104ffbe [project @ 2005-03-03 06:37:19 by jwe]
jwe
parents: 5183
diff changeset
39 ##
5187
e58bbd2b9c94 [project @ 2005-03-03 07:20:32 by jwe]
jwe
parents: 5185
diff changeset
40 ## If @var{str} is a character array or a cell array of strings, then
e58bbd2b9c94 [project @ 2005-03-03 07:20:32 by jwe]
jwe
parents: 5185
diff changeset
41 ## @var{num} and @var{status} return matrices of appropriate size.
e58bbd2b9c94 [project @ 2005-03-03 07:20:32 by jwe]
jwe
parents: 5185
diff changeset
42 ##
e58bbd2b9c94 [project @ 2005-03-03 07:20:32 by jwe]
jwe
parents: 5185
diff changeset
43 ## @var{str} can also contain multiple elements separated by row and
e58bbd2b9c94 [project @ 2005-03-03 07:20:32 by jwe]
jwe
parents: 5185
diff changeset
44 ## column delimiters (@var{cdelim} and @var{rdelim}).
e58bbd2b9c94 [project @ 2005-03-03 07:20:32 by jwe]
jwe
parents: 5185
diff changeset
45 ##
e58bbd2b9c94 [project @ 2005-03-03 07:20:32 by jwe]
jwe
parents: 5185
diff changeset
46 ## The parameters @var{cdelim}, @var{rdelim}, and @var{ddelim} are
e58bbd2b9c94 [project @ 2005-03-03 07:20:32 by jwe]
jwe
parents: 5185
diff changeset
47 ## optional column, row, and decimal delimiters.
5184
d35c5104ffbe [project @ 2005-03-03 06:37:19 by jwe]
jwe
parents: 5183
diff changeset
48 ##
5187
e58bbd2b9c94 [project @ 2005-03-03 07:20:32 by jwe]
jwe
parents: 5185
diff changeset
49 ## The default row-delimiters are newline, carriage return and semicolon
e58bbd2b9c94 [project @ 2005-03-03 07:20:32 by jwe]
jwe
parents: 5185
diff changeset
50 ## (ASCII 10, 13 and 59). The default column-delimiters are tab, space
e58bbd2b9c94 [project @ 2005-03-03 07:20:32 by jwe]
jwe
parents: 5185
diff changeset
51 ## and comma (ASCII 9, 32, and 44). The default decimal delimiter is
e58bbd2b9c94 [project @ 2005-03-03 07:20:32 by jwe]
jwe
parents: 5185
diff changeset
52 ## @samp{.} (ASCII 46).
5184
d35c5104ffbe [project @ 2005-03-03 06:37:19 by jwe]
jwe
parents: 5183
diff changeset
53 ##
5187
e58bbd2b9c94 [project @ 2005-03-03 07:20:32 by jwe]
jwe
parents: 5185
diff changeset
54 ## @var{cdelim}, @var{rdelim}, and @var{ddelim} must contain only nul,
e58bbd2b9c94 [project @ 2005-03-03 07:20:32 by jwe]
jwe
parents: 5185
diff changeset
55 ## newline, carriage return, semicolon, colon, slash, tab, space, comma,
e58bbd2b9c94 [project @ 2005-03-03 07:20:32 by jwe]
jwe
parents: 5185
diff changeset
56 ## or @samp{()[]@{@}} (ASCII 0, 9, 10, 11, 12, 13, 14, 32, 33, 34, 40,
e58bbd2b9c94 [project @ 2005-03-03 07:20:32 by jwe]
jwe
parents: 5185
diff changeset
57 ## 41, 44, 47, 58, 59, 91, 93, 123, 124, 125).
e58bbd2b9c94 [project @ 2005-03-03 07:20:32 by jwe]
jwe
parents: 5185
diff changeset
58 ##
e58bbd2b9c94 [project @ 2005-03-03 07:20:32 by jwe]
jwe
parents: 5185
diff changeset
59 ## Examples:
e58bbd2b9c94 [project @ 2005-03-03 07:20:32 by jwe]
jwe
parents: 5185
diff changeset
60 ##
e58bbd2b9c94 [project @ 2005-03-03 07:20:32 by jwe]
jwe
parents: 5185
diff changeset
61 ## @example
e58bbd2b9c94 [project @ 2005-03-03 07:20:32 by jwe]
jwe
parents: 5185
diff changeset
62 ## str2double ("-.1e-5")
e58bbd2b9c94 [project @ 2005-03-03 07:20:32 by jwe]
jwe
parents: 5185
diff changeset
63 ## @result{} -1.0000e-006
5184
d35c5104ffbe [project @ 2005-03-03 06:37:19 by jwe]
jwe
parents: 5183
diff changeset
64 ##
5187
e58bbd2b9c94 [project @ 2005-03-03 07:20:32 by jwe]
jwe
parents: 5185
diff changeset
65 ## str2double (".314e1, 44.44e-1, .7; -1e+1")
e58bbd2b9c94 [project @ 2005-03-03 07:20:32 by jwe]
jwe
parents: 5185
diff changeset
66 ## @result{}
e58bbd2b9c94 [project @ 2005-03-03 07:20:32 by jwe]
jwe
parents: 5185
diff changeset
67 ## 3.1400 4.4440 0.7000
e58bbd2b9c94 [project @ 2005-03-03 07:20:32 by jwe]
jwe
parents: 5185
diff changeset
68 ## -10.0000 NaN NaN
5184
d35c5104ffbe [project @ 2005-03-03 06:37:19 by jwe]
jwe
parents: 5183
diff changeset
69 ##
7031
120f3135952f [project @ 2007-10-15 15:30:03 by jwe]
jwe
parents: 7017
diff changeset
70 ## line = "200, 300, NaN, -inf, yes, no, 999, maybe, NaN";
5187
e58bbd2b9c94 [project @ 2005-03-03 07:20:32 by jwe]
jwe
parents: 5185
diff changeset
71 ## [x, status] = str2double (line)
7031
120f3135952f [project @ 2007-10-15 15:30:03 by jwe]
jwe
parents: 7017
diff changeset
72 ## @result{} x =
120f3135952f [project @ 2007-10-15 15:30:03 by jwe]
jwe
parents: 7017
diff changeset
73 ## 200 300 NaN -Inf NaN NaN 999 NaN NaN
120f3135952f [project @ 2007-10-15 15:30:03 by jwe]
jwe
parents: 7017
diff changeset
74 ## @result{} status =
120f3135952f [project @ 2007-10-15 15:30:03 by jwe]
jwe
parents: 7017
diff changeset
75 ## 0 0 0 0 -1 -1 0 -1 0
5187
e58bbd2b9c94 [project @ 2005-03-03 07:20:32 by jwe]
jwe
parents: 5185
diff changeset
76 ## @end example
e58bbd2b9c94 [project @ 2005-03-03 07:20:32 by jwe]
jwe
parents: 5185
diff changeset
77 ## @end deftypefn
e58bbd2b9c94 [project @ 2005-03-03 07:20:32 by jwe]
jwe
parents: 5185
diff changeset
78
e58bbd2b9c94 [project @ 2005-03-03 07:20:32 by jwe]
jwe
parents: 5185
diff changeset
79 ## Author: Alois Schloegl <a.schloegl@ieee.org>
e58bbd2b9c94 [project @ 2005-03-03 07:20:32 by jwe]
jwe
parents: 5185
diff changeset
80 ## Adapted-by: jwe
5183
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
81
5185
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
82 function [num, status, strarray] = str2double (s, cdelim, rdelim, ddelim)
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
83
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
84 FLAG_OCTAVE = exist('OCTAVE_VERSION','builtin');
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
85
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
86 ## digits, sign, exponent,NaN,Inf
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
87 ## valid_char = '0123456789eE+-.nNaAiIfF';
5183
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
88
5185
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
89 ## valid delimiters
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
90 valid_delim = char (sort ([0, 9:14, 32:34, abs("()[]{},;:\"|/")]));
5184
d35c5104ffbe [project @ 2005-03-03 06:37:19 by jwe]
jwe
parents: 5183
diff changeset
91
5185
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
92 if (nargin < 1)
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
93 error ("missing input argument");
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
94 endif
5184
d35c5104ffbe [project @ 2005-03-03 06:37:19 by jwe]
jwe
parents: 5183
diff changeset
95
5185
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
96 if (nargin < 2)
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
97 ## column delimiter
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
98 cdelim = char ([9, 32, abs(",")]);
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
99 else
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
100 ## make unique cdelim
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
101 cdelim = char (sort (cdelim(:)));
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
102 tmp = [1; 1+find(diff(abs(cdelim))>0)];
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
103 cdelim = cdelim(tmp)';
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
104 endif
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
105
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
106 if (nargin < 3)
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
107 ## row delimiter
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
108 rdelim = char ([0, 10, 13, abs(";")]);
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
109 else
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
110 ## make unique rdelim
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
111 rdelim = char (sort (rdelim(:)));
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
112 tmp = [1; 1+find(diff(abs(rdelim))>0)];
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
113 rdelim = rdelim(tmp)';
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
114 endif
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
115
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
116 if (nargin < 4)
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
117 ddelim = '.';
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
118 elseif (length (ddelim) != 1)
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
119 error ("decimal delimiter must be exactly one character");
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
120 endif
5183
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
121
5185
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
122 ## check if RDELIM and CDELIM are distinct
5184
d35c5104ffbe [project @ 2005-03-03 06:37:19 by jwe]
jwe
parents: 5183
diff changeset
123
5185
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
124 delim = sort (abs ([cdelim, rdelim, ddelim]));
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
125 tmp = [1, 1+find(diff(delim)>0)];
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
126 delim = delim(tmp);
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
127 ## [length(delim),length(cdelim),length(rdelim)]
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
128 if (length (delim) < (length(cdelim) + length(rdelim))+1)
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
129 ## length (ddelim) must be one.
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
130 error ("row, column and decimal delimiter are not distinct");
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
131 endif
5184
d35c5104ffbe [project @ 2005-03-03 06:37:19 by jwe]
jwe
parents: 5183
diff changeset
132
5185
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
133 ## check if delimiters are valid
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
134 tmp = sort (abs ([cdelim, rdelim]));
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
135 flag = zeros (size (tmp));
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
136 k1 = 1;
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
137 k2 = 1;
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
138 while (k1 <= length (tmp) && k2 <= length (valid_delim)),
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
139 if (tmp(k1) == valid_delim(k2))
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
140 flag(k1) = 1;
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
141 k1++;
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
142 elseif (tmp(k1) < valid_delim(k2))
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
143 k1++;
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
144 elseif (tmp(k1) > valid_delim(k2))
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
145 k2++;
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
146 endif
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
147 endwhile
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
148 if (! all (flag))
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
149 error ("invalid delimiters!");
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
150 endif
5183
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
151
5185
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
152 ## various input parameters
5183
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
153
5185
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
154 if (isnumeric (s))
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
155 if (all (s < 256) && all (s >= 0))
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
156 s = char (s);
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
157 else
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
158 error ("str2double: input variable must be a string");
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
159 endif
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
160 endif
5183
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
161
5185
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
162 if (isempty (s))
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
163 num = [];
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
164 status = 0;
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
165 return;
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
166 elseif (iscell (s))
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
167 strarray = s;
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
168 elseif (ischar (s) && all (size (s) > 1))
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
169 ## char array transformed into a string.
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
170 for k = 1:size (s, 1)
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
171 tmp = find (! isspace (s(k,:)));
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
172 strarray{k,1} = s(k,min(tmp):max(tmp));
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
173 endfor
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
174 elseif (ischar (s)),
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
175 num = [];
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
176 status = 0;
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
177 strarray = {};
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
178 ## add stop sign; makes sure last digit is not skipped
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
179 s(end+1) = rdelim(1);
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
180 RD = zeros (size (s));
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
181 for k = 1:length (rdelim),
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
182 RD = RD | (s == rdelim(k));
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
183 endfor
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
184 CD = RD;
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
185 for k = 1:length (cdelim),
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
186 CD = CD | (s==cdelim(k));
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
187 endfor
5184
d35c5104ffbe [project @ 2005-03-03 06:37:19 by jwe]
jwe
parents: 5183
diff changeset
188
5185
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
189 k1 = 1; # current row
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
190 k2 = 0; # current column
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
191 k3 = 0; # current element
5183
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
192
5185
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
193 sl = length (s);
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
194 ix = 1;
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
195 ## while (ix < sl) & any(abs(s(ix))==[rdelim,cdelim]),
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
196 while (ix < sl && CD(ix))
5920
bf4241378994 [project @ 2006-08-14 16:46:32 by jwe]
jwe
parents: 5307
diff changeset
197 ix++;
5185
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
198 endwhile
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
199 ta = ix;
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
200 te = [];
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
201 while (ix <= sl)
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
202 if (ix == sl)
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
203 te = sl;
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
204 endif
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
205 ## if any(abs(s(ix))==[cdelim(1),rdelim(1)]),
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
206 if (CD(ix))
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
207 te = ix - 1;
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
208 endif
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
209 if (! isempty (te))
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
210 k2++;
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
211 k3++;
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
212 strarray{k1,k2} = s(ta:te);
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
213 ## strarray{k1,k2} = [ta,te];
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
214
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
215 flag = 0;
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
216 ## while any(abs(s(ix))==[cdelim(1),rdelim(1)]) & (ix < sl),
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
217 while (CD(ix) && ix < sl)
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
218 flag = flag | RD(ix);
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
219 ix++;
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
220 endwhile
5183
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
221
5185
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
222 if (flag)
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
223 k2 = 0;
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
224 k1++;
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
225 endif
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
226 ta = ix;
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
227 te = [];
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
228 endif
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
229 ix++;
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
230 endwhile
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
231 else
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
232 error ("str2double: invalid input argument");
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
233 endif
5184
d35c5104ffbe [project @ 2005-03-03 06:37:19 by jwe]
jwe
parents: 5183
diff changeset
234
5185
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
235 [nr, nc]= size (strarray);
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
236 status = zeros (nr, nc);
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
237 num = repmat (NaN, nr, nc);
5184
d35c5104ffbe [project @ 2005-03-03 06:37:19 by jwe]
jwe
parents: 5183
diff changeset
238
5185
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
239 for k1 = 1:nr
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
240 for k2 = 1:nc
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
241 t = strarray{k1,k2};
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
242 if (length (t) == 0)
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
243 ## return error code
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
244 status(k1,k2) = -1;
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
245 num(k1,k2) = NaN;
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
246 else
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
247 ## get mantisse
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
248 g = 0;
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
249 v = 1;
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
250 if (t(1) == "-")
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
251 v = -1;
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
252 l = min (2, length(t));
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
253 elseif (t(1) == "+")
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
254 l = min (2, length (t));
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
255 else
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
256 l = 1;
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
257 endif
5184
d35c5104ffbe [project @ 2005-03-03 06:37:19 by jwe]
jwe
parents: 5183
diff changeset
258
5185
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
259 if (strcmpi (t(l:end), "inf"))
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
260 num(k1,k2) = v*Inf;
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
261 elseif (strcmpi (t(l:end), "NaN"));
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
262 num(k1,k2) = NaN;
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
263 else
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
264 if (ddelim == ".")
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
265 t(t==ddelim) = ".";
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
266 endif
5187
e58bbd2b9c94 [project @ 2005-03-03 07:20:32 by jwe]
jwe
parents: 5185
diff changeset
267 [v, tmp2, c] = sscanf(char(t), "%f %s", "C");
5185
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
268 ## [v,c,em,ni] = sscanf(char(t),"%f %s");
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
269 ## c = c * (ni>length(t));
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
270 if (c == 1),
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
271 num(k1,k2) = v;
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
272 else
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
273 num(k1,k2) = NaN;
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
274 status(k1,k2) = -1;
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
275 endif
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
276 endif
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
277 endif
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
278 endfor
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
279 endfor
5184
d35c5104ffbe [project @ 2005-03-03 06:37:19 by jwe]
jwe
parents: 5183
diff changeset
280
5185
75a442ecd410 [project @ 2005-03-03 06:59:01 by jwe]
jwe
parents: 5184
diff changeset
281 endfunction