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.

转载于:https://www.cnblogs.com/csulennon/p/4204258.html

Matlab一个错误引发的血案:??? Error using == str2num Requires string or character array input....相关推荐

  1. 一个普通ERROR 1135 (HY000)错误引发的血案:

    一个普通ERROR 1135 (HY000)错误引发的血案: 今天接到测试人员反应,测试环境前端应用程序无连接mysql数据库,登录mysql服务器,查看错误日志,发现有如下报错: 点击(此处)折叠或 ...

  2. 1135 mysql_Mysql实例mysql中一个普通ERROR 1135 (HY000)错误引发的血案

    <Mysql实例mysql中一个普通ERROR 1135 (HY000)错误引发的血案>要点: 本文介绍了Mysql实例mysql中一个普通ERROR 1135 (HY000)错误引发的血 ...

  3. 『转』度百死去飞秋一个BUG引发的血案

    作了一篇文章度百死去飞秋一个BUG引发的血案,昨天,度百死去的美国客户发邮件给我,说我的软件出问题了,我查来查去,发现居然是服务器上一个目录无法删除,一删除就报 cannot read from th ...

  4. ”一个馒头引发的血案“|记Mybatis之BindingException异常的产生及解决过程

    一. 业务场景 前几天壹哥带学生做一个项目,需要更新数据库中的车辆信息表,具体需求是要根据指定车辆的设备id(编号和设备ID均非主键)来更新车辆信息.壹哥要求学生们用Mybatis进行实现,所以就在对 ...

  5. matlab输入错误怎么修改,matlab 一个错误 怎么修改

    问题描述: matlab 一个错误 怎么修改 clc,clear a=[3 2 1 5 5 4 4 7 0 8 3 11 7 9 9 6 10 2 14 0 17 3 14 6 12 9 10 12 ...

  6. 摘要: Druid连接池一个设置引发的血案 -- 链接池出现问题

    摘要: Druid连接池一个设置引发的血案 今天在一台配置很低的机器上运行批量更新的程序~~~ 大概跑了三十分钟~~~这配置~~~这程序~~~ 然后华丽丽的报异常了~~~ 具体异常是这样的, DEBU ...

  7. 【Elasticsearch】es 一个数据精度引发的血案

    1.概述 在看博客的时候,发现有个博客 一个数据精度引发的血案 上面说,数据精度会丢失,然后我在 7.8.0版本的es测试,发现数据没有丢失. POST /index-lcc-0002/_doc {& ...

  8. 一个馒头引发的血案...请看完无极后观看此片,保笑死人不偿命

    一个馒头引发的血案... 采用搞笑的手法拍摄的,笑到你喷饭,极大的讽刺无极 下载地址:点击下载

  9. 一个随机数引发的血案

    一个随机数引发的血案 我也来做一次标题党 原文地址:http://blog.csdn.net/WinsenJiansbomber/article/details/50604653 目录 一个随机数引发 ...

最新文章

  1. Java 性能优化:教你提高代码运行的效率
  2. 三个点在同一个半圆的概率_【国际数学竞赛】列方程求概率
  3. redis的持久化方式有哪些?
  4. 初中地理知识大盘点《地理青花瓷》
  5. 架构 什么是CDN加速?为什么要用CDN
  6. T9社区注册流程记录(笔记)
  7. 剧情插件Cutscene Creator uSequencer 1.3.7.1使用说明二
  8. BaseTestCase system 1.0 体验版
  9. 手握百万恶意IP,阿里云要跟黑客拼了 | 云栖大会
  10. 关系图谱在反欺诈场景中的应用及实践
  11. 《计算机网络教程》(微课版 第五版)第七章 网络安全 课后习题及答案
  12. My Fifty-fifth Page - 子集 - By Nicolas
  13. 推荐算法之Thompson(汤普森)采样
  14. 基于单片机的水壶自动加热系统_基于单片机的智能热水壶设计 -
  15. RoadRunner中自建地图并作为Carla Map笔记
  16. python爬虫-网易云音乐的歌曲热评
  17. 2019复旦大学计算机分数线,2019复旦大学录取分数线(在各省市录取数据)
  18. 《图解TCP/IP》笔记
  19. 在VMware8.0下安装crux2.6
  20. web实现消息推送及桌面提醒

热门文章

  1. 天平游码读数例题_天平游码读数
  2. GitHub 官方代码扫描工具上线!
  3. android 自定义view 动画效果,Android自定义view实现阻尼效果的加载动画
  4. 中国大学慕课MOOC ,Shell测试答案
  5. 智能车入门——跑车前的零碎知识<新手从零做车>
  6. 技术分享:逆向破解华为路由器第三部分
  7. iPhone开发基础教程笔记(二)--第三章 处理基本交互
  8. 安森美在罗马尼亚设立新研发中心,提升全球设计能力
  9. 宋体查询1.mysql数据库复习加强 2.mysql事务触发器 3.mysql 索引外键加强 4.zendstudio 的安装使用 5.svn版本控制器的使用-java教程...
  10. 千万千万不可运行的Linux命令