仿真在线:有限元分析咨询与培训中心——Ansys|Fluent|Abaqus|HFSS|SolidWorks|课程培训

Matlab一個錯誤引發的血案:??? Error using ==> str2num Requires string or character array input.【轉發】

2017-05-25  by:CAE仿真在線  來源:互聯網

Matlab總遇到一些神奇的問題,讓人摸不著頭腦。昨天編寫程序的時候遇到一個讓我十分火大的問題,也是自己的matlab基礎不好吧。

先描述一下問題,再GUI界面有個listbox,Tag屬性是’listbox1’,里面是這樣的數據,我的目的是要把這些數據轉換成數值類型的矩陣:

QQ截圖20150105161932

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)

image

難道不應該是這樣子的嗎?好吧,可能不應該是數組吧,我又做了如下的實驗:

str={' 56 30 3.09 0'; ' 32 46 3.83 30'; ' 60 429 11.69 6935'}

str2num(str)

image

果然報了相同的錯誤!在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)

image
image

③當待轉換字符數組是單個數字的時候推薦使用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適用與轉換單個數字。所以

image
轉換就會失敗!

我們注意到上面的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轉換我們需要轉換的數據還是不行呀:

image

好吧是我讀文檔不認真,人家都說了是轉換單個數字,改成這樣就可以了:

image

但是現在的問題是我要轉換一行里面由于多個數字的數據怎么辦呢?

回到本文開頭的位置:你會發現str2num的轉換str只是一個‘[]’和一個‘{}’的區別就能轉換了,由此可以推測他們的數據類型是不一樣的,再結合str2double里面的描述可以推測‘{}’代表的就是‘cell’數據類型。

為了驗證他們的數據類型我們做如下實驗:

image

image

果然,他們的數據類型是不一樣的!并且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類型的創建方式,但是我要的是轉換方式呀。繼續搜索文檔:

image

貌似發現了目標:

image

重點來了,使用cellstr()函數可以使用character array(字符數組)創建一個cell array,使用char()可以轉換回來!

終于看到了光明,實驗一下:

image

現在可以成功轉換了!



總結:

使用char()函數將cell array 轉換成 char array.

轉自:http://www.cnblogs.com/csulennon/p/4204258.html


開放分享:優質有限元技術文章,助你自學成才

相關標簽搜索:Matlab一個錯誤引發的血案:??? Error using ==> str2num Requires string or character array input.【轉發】 MatLab培訓 MatLab培訓課程 MatLab在線視頻教程 MatLab技術學習教程 MatLab軟件教程 MatLab資料下載 MatLab代做 MatLab基礎知識 Fluent、CFX流體分析 HFSS電磁分析 Ansys培訓 Abaqus培訓 

編輯
在線報名:
  • 客服在線請直接聯系我們的客服,您也可以通過下面的方式進行在線報名,我們會及時給您回復電話,謝謝!
驗證碼

全國服務熱線

1358-032-9919

廣州公司:
廣州市環市中路306號金鷹大廈3800
電話:13580329919
          135-8032-9919
培訓QQ咨詢:點擊咨詢 點擊咨詢
項目QQ咨詢:點擊咨詢
email:kf@1cae.com




主站蜘蛛池模板: 健身器材_健身器材厂_健身器材厂家-徐州兰士健身器材有限公司 | 淘客联盟平台_网络电话系统-河南英邦软件科技有限公司官网 | 全自动滤水器_射水抽气器_气液两相流疏水器-连云港神美电力辅机有限公司 | 联系我们-99公司开户电话-99厅| 兰州环氧地坪,兰州防火涂料-甘肃皓天环氧地坪工程 | 蒸汽孔板流量计-法兰式孔板流量计-一体化标准孔板流量计-金湖中原仪表有限公司 | 温州合发模架科技有限公司 | 廊坊纳科新材料技术有限公司--纳科新材料技术有限公司|廊坊纳科新材料|纳科新材料技术 | 太原重卡叔叔运输有限公司-山西太原大件运输、太原物流公司、太原货运物流、太原大件运输、太原货运信息、长治物流公司、长治大件运输、晋城物流公司、晋城大件运输、忻州大件运输、朔州大件运输、阳泉大件运输、大同大件运输、吕梁大件运输、临汾大件运输、运城大件运城 | 学汽修,学汽修技术,汽修培训班,汽车美容培训,汽车新能源技术培训-广州万通汽车培训学校[官方网站] | 一体式电磁流量计_分体式电磁流量计_卫生级电磁流量计_卫生型电磁流量计_电池供电电磁流量计_卡箍式电磁流量计_废水电磁流量计_德克森仪表(淮安)有限公司官网 | 噪声治理,消声器,隔声屏障,隔声罩,噪声控制,降噪,空调降噪,水泵噪声治理,冷却塔噪声治理-北京华清恒业环保设备有限公司 | 啤酒厂家_啤酒代工厂_原浆啤酒厂家 - 山东十谷啤酒有限公司 | 陶瓷颗粒厂家_彩色路面_彩色陶瓷颗粒-山东顺驰道路材料有限公司 陶瓷复合钢管-专业提供江苏陶瓷钢管和陶瓷内衬复合钢管的生产厂家 | 土工布厂家,土工布价格,山东德旭达土工材料有限公司 | 专业网站建设_企业品牌营销 · 北京汇仁智杰科技有限公司 | 山东正奇塑料机械有限公司,山东塑料机械,水带机组,塑料管材机,山东吹膜机组厂家,山东农膜机厂家 山东长青石油液压机械有限公司-致力于石油机械设备的研发制造,提供定制服务 | 输送机_山东输送机厂家-山东中输输送机械有限公司 | 桥梁伸缩缝_桥梁伸缩缝厂家_桥梁伸缩缝价格-衡水淞皓路桥养护工程有限公司 | 全自动拆包机,自动拆包机,全自动逐层拆包机,全自动吨袋拆包机,吨袋拆包机,管链输送机,气流分级机 | 银马全自动免烧砖机设备厂家,提供免烧砖机价格报价及生产视频 | 木箱_木箱包装_出口木箱设计_熏蒸木箱价格_包装木箱厂 | 清河县隆鑫密封件有限公司,汽车用密封条,配电箱柜、集装箱密封胶条,建筑门窗、家具用密封条,无毒环保医用密封条,船舶、农机用密封条,异型产品 | 智慧网格,智慧城市,智慧社区,精准扶贫,农村电商,网格化,网格化管理,智慧养老,北京瑞光极远数码科技有限公司 | 襄阳燃烧器厂家-低氮燃烧器价格-河北五通道燃烧器就找襄阳市胜合燃力设备有限公司一站式服务 | 找标牌网-数字标牌,广告牌,标识标牌行业门户网站 | 山东净化车间_净化工程_净化公司-山东海蓝净化装饰工程有限公司 山东金起起重机械有限公司[官网]-金桥银路悬臂吊,金起龙门吊,山东金起起重行吊,单梁起重机 | 生物可降解膜_全降解薄膜_可降解包装膜材料厂家-凯峰降解膜 | 制砂机_鹅卵石制砂机_河卵石制砂机_制砂机价格-上海山卓重工机械有限公司 | 上海熙隆光电科技有限公司-半导体激光器,一字线激光器,光纤耦合激光器,拉曼激光器 | 潍坊网络推广,临沂360推广,东营360推广,枣庄360推广,潍坊网站建设,潍坊网络公司,潍坊360搜索,潍坊APP开发,潍坊360推广,潍坊360代理,潍坊点睛网络科技有限公司 | 衢州装饰公司_衢州装修公司_衢州创美装饰工程有限公司 - Powered by www.qzcmzs.com | 联塑管代理,联塑管厂家批发,中财管总代理,康泰管代理,康泰管厂家批发-邯郸市中枢贸易有限公司 | 黑料网 - 黑料大事记-黑料门 黑料社最新 今日黑料 热门黑料 最新反差免费-黑料网今日黑料首页_黑料网 - 黑料大事记-黑料门 黑料社最新 今日黑料 热门黑料 最新反差免费-黑料网今日黑料首页 | 影像测量仪|检测设备定制|平面度测量仪|三坐标测量机|广州市海科思自动化设备有限公司-400-0528-668 | 随车吊,洒水车,吸污车-程力专用汽车股份有限公司 | 驾驶洗地机|手推洗地车|天津洗地机|扫地车|仓库工厂扫地机|工业吸尘器|扫雪机|耐洁思 | 精密铸造-不锈钢精密铸件-硅溶胶铸造-常州思泉汽车科技有限公司 精密铸造,精密铸件,不锈钢铸造,不锈钢铸件-常州鸿雁行机械科技有限公司 | 钎头_球齿钎头_一字钎头 - 铜陵狮达矿山机械有限公司 | 江苏科星新材料有限公司 - 南通科星化工股份有限公司 - 南通星奇新材料有限公司 | 小程序商城,_电商系统源码,直播商城定制开发电商系统源码,电商系统,java电商系统 |