annotate scripts/strings/str2double.m @ 5183:cfd451656707

[project @ 2005-03-03 06:30:04 by jwe]
author jwe
date Thu, 03 Mar 2005 06:30:04 +0000
parents
children d35c5104ffbe
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5183
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
1 function [num,status,strarray] = str2double(s,cdelim,rdelim,ddelim)
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
2 %% STR2DOUBLE converts strings into numeric values
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
3 %% [NUM, STATUS,STRARRAY] = STR2DOUBLE(STR)
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
4 %%
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
5 %% STR2DOUBLE can replace STR2NUM, but avoids the insecure use of EVAL
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
6 %% on unknown data [1].
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
7 %%
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
8 %% STR can be the form '[+-]d[.]dd[[eE][+-]ddd]'
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
9 %% d can be any of digit from 0 to 9, [] indicate optional elements
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
10 %% NUM is the corresponding numeric value.
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
11 %% if the conversion fails, status is -1 and NUM is NaN.
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
12 %% STATUS = 0: conversion was successful
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
13 %% STATUS = -1: couldnot convert string into numeric value
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
14 %% STRARRAY is a cell array of strings.
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
15 %%
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
16 %% Elements which are not defined or not valid return NaN and
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
17 %% the STATUS becomes -1
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
18 %% STR can be also a character array or a cell array of strings.
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
19 %% Then, NUM and STATUS return matrices of appropriate size.
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
20 %%
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
21 %% STR can also contain multiple elements.
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
22 %% default row-delimiters are:
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
23 %% NEWLINE, CARRIAGE RETURN and SEMICOLON i.e. ASCII 10, 13 and 59.
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
24 %% default column-delimiters are:
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
25 %% TAB, SPACE and COMMA i.e. ASCII 9, 32, and 44.
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
26 %% default decimal delimiter is '.' char(46), sometimes (e.g in
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
27 %% Tab-delimited text files generated by Excel export in Europe)
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
28 %% might used ',' as decimal delimiter.
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
29 %%
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
30 %% [NUM, STATUS] = STR2DOUBLE(STR,CDELIM,RDELIM,DDELIM)
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
31 %% CDELIM .. [OPTIONAL] user-specified column delimiter
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
32 %% RDELIM .. [OPTIONAL] user-specified row delimiter
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
33 %% DDELIM .. [OPTIONAL] user-specified decimal delimiter
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
34 %% CDELIM, RDELIM and DDELIM must contain only
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
35 %% NULL, NEWLINE, CARRIAGE RETURN, SEMICOLON, COLON, SLASH, TAB, SPACE, COMMA, or ()[]{}
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
36 %% i.e. ASCII 0,9,10,11,12,13,14,32,33,34,40,41,44,47,58,59,91,93,123,124,125
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
37 %%
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
38 %% Examples:
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
39 %% str2double('-.1e-5')
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
40 %% ans = -1.0000e-006
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
41 %%
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
42 %% str2double('.314e1, 44.44e-1, .7; -1e+1')
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
43 %% ans =
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
44 %% 3.1400 4.4440 0.7000
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
45 %% -10.0000 NaN NaN
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
46 %%
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
47 %% line ='200,300,400,NaN,-inf,cd,yes,no,999,maybe,NaN';
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
48 %% [x,status]=str2double(line)
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
49 %% x =
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
50 %% 200 300 400 NaN -Inf NaN NaN NaN 999 NaN NaN
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
51 %% status =
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
52 %% 0 0 0 0 0 -1 -1 -1 0 -1 0
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
53 %%
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
54 %% Reference(s):
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
55 %% [1] David A. Wheeler, Secure Programming for Linux and Unix HOWTO.
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
56 %% http://en.tldp.org/HOWTO/Secure-Programs-HOWTO/
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
57
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
58 %% This program is free software; you can redistribute it and/or
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
59 %% modify it under the terms of the GNU General Public License
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
60 %% as published by the Free Software Foundation; either version 2
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
61 %% of the License, or (at your option) any later version.
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
62 %%
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
63 %% This program is distributed in the hope that it will be useful,
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
64 %% but WITHOUT ANY WARRANTY; without even the implied warranty of
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
65 %% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
66 %% GNU General Public License for more details.
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
67 %%
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
68 %% You should have received a copy of the GNU General Public License
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
69 %% along with this program; if not, write to the Free Software
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
70 %% Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
71
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
72 %% $Revision: 1.11 $
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
73 %% $Id: str2double.m,v 1.11 2004/06/23 20:52:32 schloegl Exp $
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
74 %% Copyright (C) 2004 by Alois Schloegl <a.schloegl@ieee.org>
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
75 %% This function is part of Octave-Forge http://octave.sourceforge.net/
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
76
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
77 FLAG_OCTAVE = exist('OCTAVE_VERSION','builtin');
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
78
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
79 % valid_char = '0123456789eE+-.nNaAiIfF'; % digits, sign, exponent,NaN,Inf
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
80 valid_delim = char(sort([0,9:14,32:34,abs('()[]{},;:"|/')])); % valid delimiter
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
81 if nargin < 1,
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
82 error('missing input argument.')
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
83 end;
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
84 if nargin < 2,
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
85 cdelim = char([9,32,abs(',')]); % column delimiter
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
86 else
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
87 % make unique cdelim
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
88 cdelim = char(sort(cdelim(:)));
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
89 tmp = [1;1+find(diff(abs(cdelim))>0)];
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
90 cdelim = cdelim(tmp)';
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
91 end;
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
92 if nargin < 3,
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
93 rdelim = char([0,10,13,abs(';')]); % row delimiter
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
94 else
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
95 % make unique rdelim
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
96 rdelim = char(sort(rdelim(:)));
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
97 tmp = [1;1+find(diff(abs(rdelim))>0)];
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
98 rdelim = rdelim(tmp)';
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
99 end;
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
100 if nargin<4,
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
101 ddelim = '.';
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
102 elseif length(ddelim)~=1,
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
103 error('decimal delimiter must be exactly one character.');
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
104 end;
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
105
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
106 % check if RDELIM and CDELIM are distinct
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
107 delim = sort(abs([cdelim,rdelim,ddelim]));
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
108 tmp = [1, 1 + find(diff(delim)>0)];
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
109 delim = delim(tmp);
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
110 %[length(delim),length(cdelim),length(rdelim)]
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
111 if length(delim) < (length(cdelim)+length(rdelim))+1, % length(ddelim) must be one.
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
112 error('row, column and decimal delimiter are not distinct.');
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
113 end;
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
114
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
115 % check if delimiters are valid
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
116 tmp = sort(abs([cdelim,rdelim]));
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
117 flag = zeros(size(tmp));
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
118 k1 = 1;
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
119 k2 = 1;
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
120 while (k1 <= length(tmp)) & (k2 <= length(valid_delim)),
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
121 if tmp(k1) == valid_delim(k2),
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
122 flag(k1) = 1;
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
123 k1 = k1 + 1;
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
124 elseif tmp(k1) < valid_delim(k2),
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
125 k1 = k1 + 1;
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
126 elseif tmp(k1) > valid_delim(k2),
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
127 k2 = k2 + 1;
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
128 end;
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
129 end;
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
130 if ~all(flag),
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
131 error('Invalid delimiters!');
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
132 end;
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
133
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
134 %%%%% various input parameters
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
135 if isnumeric(s)
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
136 if all(s<256) & all(s>=0)
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
137 s = char(s);
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
138 else
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
139 error('STR2DOUBLE: input variable must be a string')
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
140 end;
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
141 end;
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
142
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
143 if isempty(s),
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
144 num = [];
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
145 status = 0;
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
146 return;
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
147
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
148 elseif iscell(s),
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
149 strarray = s;
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
150
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
151 elseif ischar(s) & all(size(s)>1), %% char array transformed into a string.
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
152 for k = 1:size(s,1),
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
153 tmp = find(~isspace(s(k,:)));
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
154 strarray{k,1} = s(k,min(tmp):max(tmp));
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
155 end;
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
156
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
157 elseif ischar(s),
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
158 num = [];
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
159 status = 0;
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
160 strarray = {};
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
161
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
162 s(end+1) = rdelim(1); % add stop sign; makes sure last digit is not skipped
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
163
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
164 RD = zeros(size(s));
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
165 for k = 1:length(rdelim),
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
166 RD = RD | (s==rdelim(k));
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
167 end;
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
168 CD = RD;
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
169 for k = 1:length(cdelim),
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
170 CD = CD | (s==cdelim(k));
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
171 end;
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
172
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
173 k1 = 1; % current row
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
174 k2 = 0; % current column
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
175 k3 = 0; % current element
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
176
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
177 sl = length(s);
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
178 ix = 1;
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
179 %while (ix < sl) & any(abs(s(ix))==[rdelim,cdelim]),
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
180 while (ix < sl) & CD(ix),
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
181 ix = ix + 1;
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
182 end;
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
183 ta = ix; te = [];
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
184 while ix <= sl;
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
185 if (ix == sl),
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
186 te = sl;
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
187 end;
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
188 %if any(abs(s(ix))==[cdelim(1),rdelim(1)]),
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
189 if CD(ix),
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
190 te = ix - 1;
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
191 end;
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
192 if ~isempty(te),
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
193 k2 = k2 + 1;
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
194 k3 = k3 + 1;
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
195 strarray{k1,k2} = s(ta:te);
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
196 %strarray{k1,k2} = [ta,te];
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
197
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
198 flag = 0;
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
199 %while any(abs(s(ix))==[cdelim(1),rdelim(1)]) & (ix < sl),
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
200 while CD(ix) & (ix < sl),
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
201 flag = flag | RD(ix);
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
202 ix = ix + 1;
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
203 end;
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
204
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
205 if flag,
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
206 k2 = 0;
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
207 k1 = k1 + 1;
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
208 end;
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
209 ta = ix;
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
210 te = [];
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
211 end;
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
212 ix = ix + 1;
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
213 end;
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
214 else
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
215 error('STR2DOUBLE: invalid input argument');
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
216 end;
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
217
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
218 [nr,nc]= size(strarray);
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
219 status = zeros(nr,nc);
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
220 num = repmat(NaN,nr,nc);
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
221
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
222 for k1 = 1:nr,
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
223 for k2 = 1:nc,
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
224 t = strarray{k1,k2};
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
225 if (length(t)==0),
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
226 status(k1,k2) = -1; %% return error code
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
227 num(k1,k2) = NaN;
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
228 else
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
229 %% get mantisse
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
230 g = 0;
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
231 v = 1;
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
232 if t(1)=='-',
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
233 v = -1;
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
234 l = min(2,length(t));
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
235 elseif t(1)=='+',
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
236 l = min(2,length(t));
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
237 else
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
238 l = 1;
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
239 end;
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
240
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
241 if strcmpi(t(l:end),'inf')
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
242 num(k1,k2) = v*inf;
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
243
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
244 elseif strcmpi(t(l:end),'NaN');
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
245 num(k1,k2) = NaN;
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
246
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
247 else
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
248 if ddelim=='.',
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
249 t(t==ddelim)='.';
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
250 end;
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
251 if FLAG_OCTAVE,
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
252 [v,tmp2,c] = sscanf(char(t),'%f %s','C');
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
253 else
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
254 [v,c,em,ni] = sscanf(char(t),'%f %s');
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
255 c = c * (ni>length(t));
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
256 end;
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
257 if (c==1),
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
258 num(k1,k2) = v;
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
259 else
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
260 num(k1,k2) = NaN;
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
261 status(k1,k2) = -1;
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
262 end
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
263 end
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
264 end;
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
265 end;
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
266 end;
cfd451656707 [project @ 2005-03-03 06:30:04 by jwe]
jwe
parents:
diff changeset
267