Matlab一个错误引发的血案:??? Error using ==> str2num Requires string or character array input.
Matlab总遇到一些神奇的问题,让人摸不着头脑。昨天编写程序的时候遇到一个让我十分火大的问题,也是自己的matlab基础不好吧。
先描述一下问题,再GUI界面有个listbox,Tag属性是’listbox1’,里面是这样的数据,我的目的是要把这些数据转换成数值类型的矩阵:
list_string = get(handles.listbox1,'string')
data=str2num((list_string));
使用上面两行代码进行转换却异常出错了!看后台的错误描述如下:
??? Error using ==> str2num
Requires string or character array input.Error in ==> wsy>pushbutton24_Callback at 654
data=str2num((list_string));Error in ==> gui_mainfcn at 75
feval(varargin{:});Error in ==> wsy at 16
gui_mainfcn(gui_State, varargin{:});??? Error while evaluating uicontrol Callback.
??? Error using ==> feval
Undefined command/function 'Untitled_1_Callback'.Error in ==> gui_mainfcn at 75
feval(varargin{:});Error in ==> wsy at 16
gui_mainfcn(gui_State, varargin{:});??? Error while evaluating uimenu Callback.
Matlab抛出的异常说明str2num函数使用错误,参数必须是字符数组(char array)或者是字符串(string)。在后台看了下获得的listbox里面的数据如下:
list_string =
' 56 30 3.09 0'
' 32 46 3.83 30'
' 19 48 3.91 76'
……(省略一大堆数据)
' 31 301 9.79 6634'
' 60 429 11.69 6935'
对呀!尼玛难道这个不是符合要求的数据?不信我们在交互界面里面做个试验:
str=[' 56 30 3.09 0'; ' 32 46 3.83 30'; ' 60 429 11.69 6935']
str2num(str)
难道不应该是这样子的吗?好吧,可能不应该是数组吧,我又做了如下的实验:
str={' 56 30 3.09 0'; ' 32 46 3.83 30'; ' 60 429 11.69 6935'}
str2num(str)
果然报了相同的错误!在baidu和论坛里面各种查,基本上没有什么满意的答案,后来只好求助于文档:
首先来看看str2num函数的用法:
>> help str2num
STR2NUM Convert string matrix to numeric array.
X = STR2NUM(S) converts a character array representation of a matrix of
numbers to a numeric matrix. For example,
S = ['1 2' str2num(S) => [1 2;3 4]
'3 4']
The numbers in the string matrix S should be ASCII character
representations of a numeric values. Each number may contain digits,
a decimal point, a leading + or - sign, an 'e' or 'd' preceding a
power of 10 scale factor, and an 'i' or 'j' for a complex unit.
If the string S does not represent a valid number or matrix,
STR2NUM(S) returns the empty matrix. [X,OK]=STR2NUM(S) will
return OK=0 if the conversion failed.
CAUTION: STR2NUM uses EVAL to convert the input argument, so side
effects can occur if the string contains calls to functions. Use
STR2DOUBLE to avoid such side effects or when S contains a single
number.
str2num的功能是将字符串矩阵转换成数值数组,字符串必须是ASCII码表中的可转化成数值的字符,如果字符串数组不是一个有效的数字或者不能过程一个矩阵,str2num函数就会返回一个空的矩阵,[X,OK]=STR2NUM(S),如果转换失败OK=0.
注意:str2num使用的是eval函数来转换输入的参数,所以如果字符串里面包含了函数的调用,就会产生副作用,推荐使用str2double来避免副作用(当待转换字符串矩阵S包含单个数字的时候)。
相信很多朋友都是看了这一段文档,从此走向一条不归之路。首先我们从这段文档描述中可以获取至少三个有用的信息
①str2num作用的对象是‘string matrix’也就是我们的错误描述中的string or characher array.
②转换失败就会[X, OK] 中OK就会返回0,转换成功就会返回1(实验可得)。如下例子:
str=['1 2 3 4'; '5 6 ']
[X,OK]=str2num(str)
③当待转换字符数组是单个数字的时候推荐使用str2double进行转换,避免副作用,如下例子:
Examples
str2double('123.45e7')
str2double('123 + 45i')
str2double('3.14159')
str2double('2.7i - 3.14')
str2double({'2.71' '3.1415'})
str2double('1,200.34')
得到如下结果:
1.2345e+009
1.2300e+002 +4.5000e+001i
3.1416
-3.1400 + 2.7000i
2.7100 3.1415
1.2003e+003
按照文档的推荐,str2num适用与转换单个数字。所以
转换就会失败!
我们注意到上面的example中以这样一个例子:str2double({'2.71' '3.1415'}),看一下文档的描述:
>> help str2double
STR2DOUBLE Convert string to double precision value.
X = STR2DOUBLE(S) converts the string S, which should be an
ASCII character representation of a real or complex scalar value,
to MATLAB's double representation. The string may contain digits,
a comma (thousands separator), a decimal point, a leading + or - sign,
an 'e' preceding a power of 10 scale factor, and an 'i' for
a complex unit.
If the string S does not represent a valid scalar value, STR2DOUBLE(S)
returns NaN.(转换失败返回NaN)
X = STR2DOUBLE(C) converts the strings in the cell array of strings C
to double. The matrix X returned will be the same size as C. NaN will
be returned for any cell which is not a string representing a valid
scalar value. NaN will be returned for individual cells in C which are
cell arrays.
注意到我标出的红色部分,‘the strings in the cell array ’也就是说str2double还可以转换cell 类型的数据。
但是使用str2double转换我们需要转换的数据还是不行呀:
好吧是我读文档不认真,人家都说了是转换单个数字,改成这样就可以了:
但是现在的问题是我要转换一行里面由于多个数字的数据怎么办呢?
回到本文开头的位置:你会发现str2num的转换str只是一个‘[]’和一个‘{}’的区别就能转换了,由此可以推测他们的数据类型是不一样的,再结合str2double里面的描述可以推测‘{}’代表的就是‘cell’数据类型。
为了验证他们的数据类型我们做如下实验:
果然,他们的数据类型是不一样的!并且cell array所占的空间要大得多几乎是两倍char array的大小。
那好了,现在的任务明确了,只需要将‘cell’类型的数据转换成数组类型就行了。
我们看一下文档:
Create cell array Syntax
c = cell(n)
c = cell(m,n) or c = cell([m n])
c = cell(m,n,p,...) or c = cell([m n p ...])
c = cell(size(A))
c = cell(javaobj)Description
c = cell(n) creates an n-by-n cell array of empty matrices. An error message appears if n is not a scalar.
c = cell(m,n) or c = cell([m,n]) creates an m-by-n cell array of empty matrices. Arguments m and n must be scalars.
c = cell(m,n,p,...) or c = cell([m n p ...]) creates an m-by-n-by-p-... cell array of empty matrices. Arguments m, n, p,... must be scalars.
c = cell(size(A)) creates a cell array the same size as A containing all empty matrices.
c = cell(javaobj) converts a Java array or Java object javaobj into a MATLAB cell array. Elements of the resulting cell array will be of the MATLAB type (if any) closest to the Java array elements or Java object.
文档中描述了Cell类型的创建方式,但是我要的是转换方式呀。继续搜索文档:
貌似发现了目标:
重点来了,使用cellstr()函数可以使用character array(字符数组)创建一个cell array,使用char()可以转换回来!
终于看到了光明,实验一下:
现在可以成功转换了!
总结:
使用char()函数将cell array 转换成 char array.
Matlab一个错误引发的血案:??? Error using ==> str2num Requires string or character array input.的更多相关文章
- 一个字母引发的血案 java.io.File中mkdir()和mkdirs()
一个字母引发的血案 明天开始放年假了,临放假前有个爬虫的任务,其中需要把网络图片保存到本地,很简单,马上写完了代码: //省略部分代码... Long fileId= (Long) data.get( ...
- SQL实战——04. 查找所有已经分配部门的员工的last_name和first_name以及dept_no (一个逗号引发的血案)
查找所有已经分配部门的员工的last_name和first_name以及dept_noCREATE TABLE `dept_emp` (`emp_no` int(11) NOT NULL,`dept_ ...
- Replication的犄角旮旯(六)-- 一个DDL引发的血案(上)(如何近似估算DDL操作进度)
<Replication的犄角旮旯>系列导读 Replication的犄角旮旯(一)--变更订阅端表名的应用场景 Replication的犄角旮旯(二)--寻找订阅端丢失的记录 Repli ...
- Replication的犄角旮旯(七)-- 一个DDL引发的血案(下)(聊聊logreader的延迟)
<Replication的犄角旮旯>系列导读 Replication的犄角旮旯(一)--变更订阅端表名的应用场景 Replication的犄角旮旯(二)--寻找订阅端丢失的记录 Repli ...
- 一个NULL引发的血案
go sql.stmt query 发生了一个NULL值,所以发现了error, 发现服务不停的初始化sql stmt, 导致连接数过多,服务就变得很慢. 首先,我在初始化的之前,要判断这个是否是NU ...
- 【原创】经验分享:一个Content-Length引发的血案(almost....)
前言 上周在工作中遇到一个问题,挺有意思,这里记录一下.上周在工作中遇到一个问题,挺有意思,这里记录一下.标题起的很唬人,这个问题差点引发血案,花哥还是很严谨的一个人,后面备注了almost.... ...
- 一个链接引发的血案---------服务器 IO及网络流量暴涨解决历程
在这里介绍一次因为更改网站地址而引发服务器IO读取速度,网络流入流出速度暴涨10倍的解决经历. 环境:Ubuntu + Nginx + php-cgi + Wordpress 事情是这样的,现在网站使 ...
- 记一次400错误引发的血案(URL中特殊符号的转义/400 bad request错误)
django+nginx+uwsgi部署的站点访问某个URL时发生了400 bad request的错误,而使用django自带的开发版的web server时没有遇到此问题.初步判断是nginx或u ...
- 【转】Druid连接池一个设置引发的血案
https://my.oschina.net/haogrgr/blog/224010 今天在一台配置很低的机器上运行批量更新的程序~~~ 大概跑了三十分钟~~~这配置~~~这程序~~~ 然后华丽丽的报 ...
随机推荐
- JAVA学习笔记--初始化与清理
编写程序时,常会由于变量没有初始化而产生各种错误:用完一个元素,如果不将其占用的内存资源释放,则会导致资源耗尽,这也很严重,为此,C++引入了构造器的概念,这是一个在创建对象时被自动调用的特殊方法,以 ...
- 【RL系列】On-Policy与Off-Policy
强化学习大致上可分为两类,一类是Markov Decision Learning,另一类是与之相对的Model Free Learning 分为这两类是站在问题描述的角度上考虑的.同样在解决方案上存在 ...
- New York Comic Con 2013 - 2013年纽约动漫展
New York Comic Con - 2013年纽约动漫展 New York Comic Con is the largest pop culture event on the East Coas ...
- C# 反射,动态编译
反射是动态获取程序集的元数据的一种技术,这句话是做.NET程序员面试题目的一个的答案,你可选择记住它,就好比高中生物学里面讲到的细胞的结构的课程时,细胞由细胞膜,细胞质和细胞核组成.根据做程序的经验, ...
- [linux] centos搭建openvpn服务,脚本颁发/吊销证书 (转载+原创)
搭建过程转载:http://yestreenstars.blog.51cto.com/1836303/1429537 环境说明:服务端:CentOS 6.5_X64客户端:Windows 7 服务端配 ...
- rest_framework之版本控制
简介 API版本控制可以用来在不同的客户端使用不同的行为.REST框架提供了大量不同的版本设计. 版本控制是由传入的客户端请求决定的,并且可能基于请求URL,或者基于请求头. 有许多有效的方法达到版本 ...
- 20172329 2018-2019《Java软件结构与数据结构》第一周学习总结
2018-2019-20172329 <Java软件结构与数据结构>第一周学习总结 在这学期就已经大二了,也已经步入了学习专业课的核心时间,在这个阶段,我们应该了解自己的学习情况,针对自己 ...
- 福大软工1816:Alpha事后诸葛
福大软工·第十一次作业-Alpha事后诸葛亮 组长博客链接 本次作业博客链接 项目Postmortem 模板 设想和目标 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描 ...
- CentOS6.5 重启网络报错:Bringing up interface eth0: Error: Connection activation failed: Device not managed by NetworkManager or unavailable
CentOS6.5 重启网络报错: Bringing up interface eth0: Error: Connection activation failed: Device not manage ...
- 【Nginx】转:Nginx try_files
原来的配置是这样的: location / { try_files $uri $uri/ /index.php; index index.html index.htm index.php; } loc ...