MATLAB Answers

0

str2num strange behaviour

Asked by Elena Casiraghi on 23 Aug 2019 at 6:04
Latest activity Commented on by Elena Casiraghi on 24 Aug 2019 at 4:50
Dear, I have this code:
svmKernel ={'rbf','gaussian', 'linear','2','3','4'};
for k=1:numel(svmKernel)
[p, status] = str2num(svmKernel{k});
if ~status; t = templateSVM('Standardize',true,'KernelFunction',svmKernel{indK});
else; t = templateSVM('Standardize',true,'KernelFunction','polynomial', 'PolynomialOrder', p); end
WHY str2num returns p =
Linear Function:
Parameters: [1×1 struct]
and status = 1 when issuing [p,status] = str2num('linear')?
[p, status] = str2num('linear')
Linear Function:
Parameters: [1×1 struct]
status =
logical
1

  6 Comments

Rik
on 23 Aug 2019 at 7:58
I would reccomend -all:
which str2num -all
That way you will see methods and shadowed functions as well. On my release (R2019a, only IPT and CFT installed) this returns:
>> which str2num -all
C:\Program Files\MATLAB\R2019a\toolbox\matlab\strfun\str2num.m
C:\Program Files\MATLAB\R2019a\toolbox\matlab\strfun\@opaque\str2num.m % opaque method
C:\Program Files\MATLAB\R2019a\toolbox\matlab\bigdata\@tall\str2num.m % tall method
Elena Casiraghi on 23 Aug 2019 at 10:57
Thanks!
This is a good information!
Elena Casiraghi on 23 Aug 2019 at 10:58
By the way, This is my result
which str2num
C:\Program Files\MATLAB\R2018a\toolbox\matlab\strfun\str2num.m

Sign in to comment.

1 Answer

Answer by Stephen Cobeldick on 23 Aug 2019 at 8:49
Edited by Stephen Cobeldick on 23 Aug 2019 at 9:40
 Accepted Answer

"str2num strange behaviour"
It is not strange behavior at all: str2num (unfortunately) relies on eval, as the str2num help clearly states "...str2num uses the eval function, which can cause unintended side effects when the input includes a function name." You provided str2num a function name to evaluate... you can easily find out which function it is evaluating:
which linear -all
As the str2num documentation recommends, you could avoid the whole problem simply by using str2double (which could be called before the loop), then using isnan.

  3 Comments

Elena Casiraghi on 23 Aug 2019 at 10:56
Thanks Stephen!
Steven Lord
on 23 Aug 2019 at 13:42
Another solution would be to avoid trying to convert that text data into numbers entirely.
svmKernel = {{'rbf'}, ...
{'gaussian'}, ...
{'linear'}, ...
{'polynomial', 'PolynomialOrder', 2}, ...
{'polynomial', 'PolynomialOrder', 3}, ...
{'polynomial', 'PolynomialOrder', 4}};
for k=1:numel(svmKernel)
t = templateSVM('Standardize',true,'KernelFunction', svmKernel{k}{:});
end
The command svmKernel{k} extracts the contents of each cell inside svmKernel in turn. Since I have cell arrays inside each of those cells, I can turn them into a comma-separated list. This is the technique shown in the "Function Call Arguments" example in the "How to Use the Comma-Separated Lists" item on that documentation page.
Elena Casiraghi on 24 Aug 2019 at 4:50
Tkanks Stephen!
I didin't know that! :)

Sign in to comment.