October 10, 2009 at 8:12 AM by Dr. Drang
In the Octave script for computing the binomial distribution that I posted a few days ago, I used the
str2num function to covert command-line arguments, which the
argv function returns as strings, into numbers. It turns out that
str2num can do more than that.
Here’s a brief Octave session demonstrating
octave-3.2.3:1> str2num('5') ans = 5 octave-3.2.3:2> str2num('5.33') ans = 5.3300 octave-3.2.3:3> str2num('5+7') ans = 12 octave-3.2.3:4> str2num('(5+7)/5') ans = 2.4000 octave-3.2.3:5> str2num('sin(pi/4)') ans = 0.70711 octave-3.2.3:6> str2num('fred') ans = (0x0) octave-3.2.3:7> str2num('[1, 2].^2') ans = 1 4
Rather than just converting a string to a number,
str2num evaluates the string as an Octave expression and then returns the result as a number. More generally, if the result is an array of numbers, it will return that array. Only if the result cannot be interpreted as a number will
str2num fail, and even in that case it won’t issue an error message; Perl-like, it will just return an empty array.
This makes my binomial script even easier to use. Recall that to demonstrate it, I ran
binomial 10 .166667
to get the distribution of ones for 10 rolls of a standard six-sided die. I could have used the simpler
binomial 10 1/6
and taken advantage of the power of
str2num to get the same result
0 0.161506 1 0.323011 2 0.290710 3 0.155045 4 0.054266 5 0.013024 6 0.002171 7 0.000248 8 0.000019 9 0.000001 10 0.000000
str2num, but avoids the use of eval on unknown data.
which is a pretty good hint that
str2num does an evaluation, but it would be nice if the docs did more than hint.