Matlab内数据及数据类型转换

Matlab中有15种基本数据类型,主要是整型、浮点、逻辑、字符、日期和时间、结构数组、单元格数组以及函数句柄等。

  1. 整型:(int8;uint8;int16;uint16;int32;uint32;int64;uint64)通过intmax(class)intmin(class)函数返回该类整型的最大值和最小值,例如 intmax(‘int8’)=127
    int8()有符号,占用1个字节。向无穷大方向取整:正数向正无穷大方向,负数向负无穷大方向取整。
    int16():有符号,占用2个字节。向无穷大方向取整:正数向正无穷大方向,负数向负无穷大方向取整。
    int32():有符号,占用4个字节。向无穷大方向取整:正数向正无穷大方向,负数向负无穷大方向取整。
    int64():有符号,占用8个字节。向无穷大方向取整:正数向正无穷大方向,负数向负无穷大方向取整。
    uint8():无符号,占用1个字节。向0方向取整。
    uint16():无符号,占用2个字节。向0方向取整。
    uint32():无符号,占用4个字节。向0方向取整。
    uint64():无符号,占用8个字节。向0方向取整。

用whos观察变量的数据类型

  1. 浮点:(single;double)
    浮点数:REALMAX('double')和REALMAX('single')分别返回双精度浮点和单精度浮点的最大值,REALMIN('double')和REALMIN ('single')分别返回双精度浮点和单精度浮点的最小值。
    Matlab 取整函数有: fix, floor, ceil, round.
    fix 朝零方向取整, fix(-1.3)=-1; fix(1.3)=1;
    floor 朝负无穷方向取整,floor(-1.3)=-2; floor(1.3)=1;
    ceil 朝正无穷方向取整, ceil(-1.3)=-1; ceil(1.3)=2;
    round 四舍五入到最近的整数, round(-1.3)=-1;round(-1.52)=-2;
    1.000 处理成 1 用 floor round fix 都行 但如果是去掉尾巴的取整,用 floor

  2. 逻辑:(logical)
    函数logical()将数值型数据转换成逻辑型数据。
    下例是逻辑索引在矩阵操作中的应用,将5*5矩阵中大于0.5的元素设定为0: A = rand(5); A(A>0.5)=0

  3. 字符: (char)
    Matlab中的输入字符需使用单引号。字符串存储为字符数组,每个元素占用一个ASCII字符。如日期字符:DateString=’9/16/2001’实际上是一个1行9列向量。构成矩阵或向量的行字符串长度必须相同。
    可以使用char函数构建字符数组,使用strcat函数连接字符。
    例如,命令name = ['abc' ; 'abcd'] 将触发错误警告,因为两个字符串的长度不等,此时可以通过空字符凑齐如:name = ['abc ' ; 'abcd'],更简单的办法是使用char函数:char(‘abc’,’abcd’),Matlab自动填充空字符以使长度相等,因此字符串矩阵的列纬总是等于最长字符串的字符数.
    例如size(char(‘abc’,’abcd’)) 返回结果[2,4],即字符串’abc’实际存在的是’abc ’,此时如需提取矩阵中的某一字符元素,需要使用deblank函数移除空格如name =char(‘abc’,’abcd’); deblank(name(1,:))
    此外,Matlab同时提供一种更灵活的单元格数组方法,使用函数cellstr可以将字符串数组转换为单元格数组:

->? 4       
cdata=cellstr(data)       length(cdata{1})
->?3```
**常用的字符操作函数**
blanks(n) 返回n个空字符       
deblank(s) 移除字符串尾部包含的空字符       
(string) 将字符串作为命令执行       
findstr(s1,s2) 搜索字符串       
ischar(s) 判断是否字符串        
isletter(s) 判断是否字母       
lower(s) 转换小写       
upper(s) 转换大写       
strcmp(s1,s2) 比较字符串是否相同       
strncmp(s1,s2,n) 比较字符串中的前n个字符是否相同       
strrep(s1,s2,s3) 将s1中的字符s2替换为s3
int2str 将整数转换为字符串 
lower 把字符串变成小写 
mat2str 将数组转换为字符串 
num2str 把数值转换为字符串 
strcat 把多个串连接成长串 
strcmp 比较字符串  
strcmpi 比较字符串(忽略大小写) 
strings MATLAB 中的字符串 
strjust 字符串的对齐方式 
strmatch 逐行搜索串  
strnomp 比较字符串的前N 个字符  
strncmpi 比较字符串的前N 个字符(忽略大小写) 
strrep 用另一个串代替一个串中的子串 
strtok 删除串中的指定子串 
strvcat 创建字符串数组  
str2mat 将字符串转换为含有空格的数组 
str2num 将字符串转换为数值

5. 日期和时间
Matlab提供三种日期格式:日期字符串如’1996-10-02’,日期序列数如729300(0000年1月1日为1)以及日期向量如 1996 10 2 0 0 0,依次为年月日时分秒。
**常用的日期操作函数**
datestr(d,f) 将日期数字转换为字符串       
datenum(str,f) 将字符串转换为日期数字       
datevec(str) 日期字符串转换向量       
weekday(d) 计算星期数       
eomday(yr,mth) 计算指定月份最后一天       
calendar(str) 返回日历矩阵        
clock 当前日期和时间的日期向量       
date 当前日期字符串       
now 当前日期和时间的序列数
6. 结构
结构是包含已命名“数据容器”或字段的数组。结构中的字段可以包含任何数据。
**构建结构数组**
(1) 赋值方法
下面的赋值命令产生一个名为patient的结构数组,该数组包含三个字段:
`patient.name = 'John Doe';
patient.billing = 127.00;
patient.test = [79 75 73; 180 178 177.5; 220 210 205];
%在命令区内输入patient可以查看结构信息:
name: 'John Doe'billing: 127test: [3x3 double]
%继续赋值可扩展该结构数组:
patient(2).name = 'Ann Lane';
patient(2).billing = 28.50;
patient(2).test = [68 70 68; 118 118 119; 172 170 169];
赋值后结构数组变为[1 2]。`
(2) 构建结构数组:struct函数 函数基本形式为:
`strArray = struct('field1',val1,'field2',val2, ...)`
例如:
`weather(1) = struct('temp', 72,'rainfall', 0.0);
weather(2) = struct('temp', 71,'rainfall', 0.1);        
weather = repmat(struct('temp', 72, 'rainfall', 0.0), 1, 3);       
weather = struct('temp', {68, 80, 72}, 'rainfall', {0.2, 0.4, 0.0});`
(3) 访问结构数据
以下都是合法的结构数组访问命令:
mypatients = patient(1:2) 获取子结构数据
mypatients(1) 访问结构数据
patient(2).name 访问结构数据中的特定字段
patient(3).test(2,2) 访问结构数据中的特定字段(该字段为数组)
bills = [patient.billing] 访问多个结构
tests = {patient(1:2).test} 提取结构数据转换成单元格数组
**使用结构字段的动态名称**
通过structName.(expression_r_r_r)可以赋予结构字段名称并访问数据。例如字段名为expression_r_r_r、结构名为structName,访问其中第7行1至25列数据可以使用命令:`structName.(expression_r_r_r)(7,1:25)`。
例如,存在一个学生每周成绩数据结构数组,其数据通过以下方式建立:
`testscores.wang.week(1:25) = ...        
[95 89 76 82 79 92 94 92 89 81 75 93 ...         
85 84 83 86 85 90 82 82 84 79 96 88 98];
testscores.chen.week(1:25) = ...                 
[87 80 91 84 99 87 93 87 97 87 82 89 ...                   
86 82 90 98 75 79 92 84 90 93 84 78 81];`
即结构名为testscores,字段使用每个学生的名称命名,分别为wang和chen,每个学生下面包含名为week的成绩结构数组。
现计算给定结构名称、学生名称和起止周数的平均分数。
在命令窗口中输入 edit avgscore.m,输入以下代码后保存文件:
`function avg = avgscore(struct, student, first, last)       
avg = sum(struct.(student).week(first:last))/(last - first + 1);`
在命名窗口中输入:avgscore(testscores, 'chen', 7, 22) 计算学生陈从第7周到第22周的平均分数。
(4) 添加和删除结构字段
命令[struct](index).(field)可添加或修改字段。
如`patient(2).ssn = '000-00-0000' `在结构patient中添加一个名为ssn的字段。
删除字段使用rmfield函数,如patient2 = rmfield(patient, 'name') 删除name字段并产生新的结构。
* 单元格数组:(cell)
单元格数组提供了不同类型数据的存储机制,可以储存任意类型和任意纬度的数组。
访问单元格数组的规则和其他数组相同,区别在于需要使用花括号{}访问,例如A{2,5}访问单元格数组A中的第2行第5列单元格。
(1) 构建单元格数组:赋值方法
使用花括号标识可直接创建单元格数组,如:
`A(1,1) = {[1 4 3; 0 5 8; 7 2 9]};       
A(1,2) = {'abcd'};       
A(2,1) = {3+7i};        
A(2,2) = {-pi:pi/10:pi};`
上述命令创建2\*2的单元格数组A。继续添加单元格元素直接使用赋值如A(2,3)={5}即可,注意需使用花括号标识。简化的方法是结合使用花括号{单元格数组}和方括号[]创建,
如`C = {[1 2], [3 4]; [5 6], [7 8]};`
(2)构建单元格数组:函数方法Cell函数。
如:`B = cell(2, 3);B(1,3) = {1:3};`
(3)访问数据
通过索引可直接访问单元格数组中的数据元素,例如:
`N{1,1} = [1 2; 4 5];
N{1,2} = 'Name';
N{2,1} = 2-4i;
N{2,2} = 7;
c = N{1,2}
d = N{1,1}(2,2)`

* 函数句柄
函数句柄是用于间接调用一个函数的Matlab值或数据类型。在调用其它函数时可以传递函数句柄,也可在数据结构中保存函数句柄备用。通过命令形式 `fhandle = @functionname `可以创建函数句柄
例如` trigFun=@sin`,或匿名函数`sqr = @(x) x.^2;`。
使用句柄调用函数的形式是
` fhandle(arg1, arg2, ..., argn) 或 fhandle()(无参数)`。
如:trigFun(1)。
例:

function x = plotFHandle(fhandle, data)plot(data, fhandle(data))
plotFHandle(@sin, -pi:0.01:pi)
%数据类型转换,如C语言中的强制类型转换相似
y=9;
z=double(y);

9. 图像数据类型
**Matlab中的图像数据类型转换**
MATLAB中读入图像的数据类型是uint8,而在矩阵中使用的数据类型是double因此 I2=im2double(I1) :把图像数组I1转换成double精度类型;如果不转换,在对uint8进行加减时会产生溢出,可能提示的错误为:
`Function '*' is not defined for values of class 'uint8'。`  



# 数据类型转换
## 一、数字转字符

1. char()
注意,char()使用的是ASCII编码。
* num2str(k)
将数字转换成字符串
* int2str(k)
将整数型转换为字符串
* mat2str(k)
将矩阵转换为字符串,供eval使用
* str2double(S)
将字符串数组转化为数值数组
* sprintf
将数据格式化为字符串

str = sprintf(formatSpec,A1,...,An)
[str,errmsg] = sprintf(formatSpec,A1,...,An)

formatSpec 部分与fprintf一致。
> fprintf与sprintf有个使用的区别需要注意
fprintf 会直接显示出来,而sprintf是形成字符串,需要用disp输出到屏幕。
fprintf需要使用‘\n’来字符串输出的结束。sprintf不需要。

## 二、字符转数字
1. double

* str2num

* str2double

## 三、数字格式间转换
logical, char,int8,uint8,int16,uint16,int32,uint32,int64,uint64,single,double
想要转化成特定类型,就用该类型作为函数.比如说double(X) int64(X)

1. base2dec X进制串转换为十进制整数 
* bin2dec 二进制串转换为十进制整数 
* dec2base 十进制整数转换为X 进制串 
* dec2bin 十进制整数转换为二进制串 
* dec2hex 十进制整数转换为16 进制串 
* findstr 在一个串中寻找一个子串 
* hex2dec 16进制串转换为十进制整数 
* hex2num 16进制串转换为浮点数 


## 四、图像数据类型转换函数
默认情况下,matlab将图像中的数据存储为double型,即64位浮点数;matlab还支持无符号整型(uint8和uint16);uint型的优势在于节省空间,涉及运算时要转换成double型。    
1. im2double()
将图像数组转换成double精度类型     
* im2uint8()
将图像数组转换成unit8类型     
> 在数据类型转换时候uint8和im2uint8的区别,uint8的操作仅仅是将一个double类型的小数点后面的部分去掉;
   但是im2uint8是将输入中所有小于0的数设置为0,而将输入中所有大于1的数值设置为255,再将所有其他值乘以255。

* im2uint16()
将图像数组转换成unit16类型 



# 执行代码
* 执行字符串 
eval

eval(expression)
[output1,...,outputN] = eval(expression)

eval(['xxxxx',variable,'xxxxxxxx;'])
eval(strcat('xxxxx',variable,'xxxxxxxx;'))

* 执行函数
feval
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,723评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,485评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,998评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,323评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,355评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,079评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,389评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,019评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,519评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,971评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,100评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,738评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,293评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,289评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,517评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,547评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,834评论 2 345

推荐阅读更多精彩内容

  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 3,212评论 0 4
  • 计算机二级C语言上机题库(南开版) 1.m个人的成绩存放在score数组中,请编写函数fun,它的功能是:将低于平...
    MrSunbeam阅读 6,323评论 1 42
  • 2017年3月23日是我们班兴奋的日子,去松江欢乐谷游玩啦!尽管外面下着蒙蒙细雨,但是它也阻挡不住我们浓烈...
    Ciciji阅读 370评论 0 1
  • 最近,经常关注的一个社群开始收费了,而且成为会员的价格不菲。 什么鬼?进个社群还要以万为单位,加进去真的就能有所收...
    程影阅读 432评论 0 2
  • https://juejin.im/entry/59a4bbb56fb9a0247a60eb5c?utm_sour...
    凯旋阅读 134评论 0 0