Octave's str2num
function
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 str2num
’s power:
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
Strangely, the Octave documentation for str2num
doesn’t mention that it does an expression evaluation, but the documentation for a similar function, str2double
says:
str2double
can replacestr2num
, 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.