Matlab数据类型

745 阅读11分钟

Matlab中提供了多种数据类型,以供用户在不同的情况下使用。用户可以创建浮点型或者整数型矩阵和数组、字符和字符串、逻辑(true或者false)表达式、函数句柄、结构(structure)数组、元胞(cell)数组、Map容器、日期和时间、分类(categorical)数组、表格、时间序列等。在MATLAB中任何一种数据类型都以矩阵或者数组的形式来表示。这里说的矩阵或者数组,是指最小的0x0或N维任何大小的矩阵或者数组; 3.1 数值型 包括有符号和无符号整数、单精度和双精度浮点数。默认情况下是双精度浮点数;用户不可以更改默认的数据类型和精度,但可以选择用非默认的整数或者单精度浮点数来存储矩阵或者数组;整数数组和单精度数组比双精度数组能节省更多的内存空间,灵活运用可以更高效地利用内存。 所有数值型数组都支持基本的数组操作;比如数组的重构、使用数学运算符等。 数值型数组或矩阵比较简单。 3.2 逻辑型 创建逻辑型矩阵或者数组的函数主要有以下三个: logical函数:可以将任意类型的数组转化为逻辑型。其中非零元素为true,零元素为false. true 函数:产生全部元素为逻辑true的数组; false函数:产生全部元素为逻辑false的数组; 例:利用函数创建逻辑型数组; rand('state',0)

a=rand(4,3) %生成测试矩阵

a =

0.9501    0.8913    0.8214
0.2311    0.7621    0.4447
0.6068    0.4565    0.6154
0.4860    0.0185    0.7919

a(a<0.6)=0; %生成测试矩阵 a =

0.9501    0.8913    0.8214
     0    0.7621         0
0.6068         0    0.6154
     0         0    0.7919

b=logical(a) %计算逻辑型矩阵b

b =

 1     1     1
 0     1     0
 1     0     1
 0     0     1

c=true(size(a)) %生成全为true的矩阵

c =

 1     1     1
 1     1     1
 1     1     1
 1     1     1

d=false([size(a),2]) %生成全为false的矩阵

d(:,:,1) =

 0     0     0
 0     0     0
 0     0     0
 0     0     0

d(:,:,2) =

 0     0     0
 0     0     0
 0     0     0
 0     0     0

whos %查看现有的变量与数据类型 Name Size Bytes Class Attributes

A 3x5 120 double
a 4x3 96 double
ans 1x2 16 double
b 4x3 12 logical
c 4x3 12 logical
d 4x3x2 24 logical
逻辑型数组中每一个元素仅占用一字节的内存空间。所以,尽管矩阵b和矩阵a的大小一样,但是在内存的占用上有相当大的差距,并且属于不同的数据类型; 3.2.2 返回逻辑结果的函数 下面的逻辑运算符或函数将会返回逻辑型的true或者false. && 具有短路作用的逻辑“与”操作,仅能处理标量; || 具有短路作用的逻辑“或”操作,仅能处理标量; & 元素“与”操作 | 元素“或”操作 ~ 逻辑“非”操作 xor 逻辑“异或”操作 any 当向量中的元素有非零元素时,返回true(也就是1) all 当向量中的元素都是非零向量,返回TRUE; == 关系运算符,等于 ~= 关系运算符,不等于 < 关系运算符,小于

关系运算符,大于 <= 关系运算符,小于等于 = 关系运算符,大于等于 所有以is开头的函数 判断操作 strcmp、strncmp、strcmpi和strncmpi 字符串比较函数 需要说明的是,参与逻辑运算的数组不必是逻辑型变量或常数,也可以是其他类型的数据,但是运算结果一定是逻辑型数据。 所谓具有短路作用是指:在进行&&或||运算时,若参与运算的变量有多个,例如a&&b&&c&&d,并且a,b,c,d这四个变量中的a为false,则后面3个变量都不再处理,运算结束,并返回运算结果为false(0), 关系运算符适用于各种数据类型的变量或者常数,运算结果是逻辑型数据。标量也可以和矩阵或者数组比较,比较的时候将自动扩展标量,返回的结果是和数组同维的逻辑型数组。如果进行比较的是两个数组,则数组必须是同维的,且每一维的大小也必须一致。 例:逻辑“与”或“非”的使用。 a=[1 2 3;4 5 6];

b=[1 0 0;0 -2 1]; A=a&b

A =

 1     0     0
 0     1     1

B=a|b

B =

 1     1     1
 1     1     1

例:函数any 和all的使用 a=[1 1 0; 1 0 0;1 0 1]

a =

 1     1     0
 1     0     0
 1     0     1

A=all(a) % 每列元素均非零时返回true

A =

 1     0     0

B=any(a) %每列中存在非零元素时返回true

B =

 1     1     1

本例中,首先创建数组,因为a的第一列均为1,所以all命令返回1;而其他列含有0,所以返回0,如结果中A显示的那样。any函数在数组一列中含有非零元素时就会返回逻辑1,所以B中的元素全部为1。 例:isstrprop函数的使用。 isstrprop函数可以用来判断一个字符串中的各字符是否属于某一类别, A =isstrprop('abc123def','alpha')

A =

 1     1     1     0     0     0     1     1     1

本例中,‘alpna’参数的作用就是判断输入字符串abc123def中那些元素属于字母,对于字母,相应地返回逻辑true,也就是1,而对于数字返回的是false,也就是0. 例:关系运算 a=[0 -1 2];

b=[-3 1 2]; a<b %对应元素比较大小,

ans =

 0     1     0

a>b %对应元素比较大小,

ans =

 1     0     0

a>=b %对应元素比较大小,

ans =

 1     0     1

a<=b %对应元素比较大小,

ans =

 0     1     1

a==b %对应元素相等

ans =

 0     0     1

a~=b %对应元素不相等

ans =

 1     1     0

3.2.3 运算符的优先级 下面将MATLAB中的运算符和计算优先级,按照从高到低的顺序进行排列。 (1)括号()。 (2)数组的转换(.'),数组幂(.^),复转置('),矩阵幂(^)。 (3)代数正(+),代数负(-),逻辑非(~)。 (4) 数组乘法(.),数组除法(./),矩阵乘法(),矩阵右除(/),矩阵左除(). (5)加法(+),减法(-)。 (6)冒号运算符(:)。 (7)小于(<),小于等于(<=),大于(>),大于等于(>=),等于(==),不等于(~=); (8)元素“与”(&). (9)元素“或”(|). (10)短路逻辑“与”(&&)。 (11)短路逻辑“或”(||)。 3.3 字符和字符串 几个字符可以构成一个字符串,把一个字符串视为一个行向量,而字符串中的每一个字符(含空格符)则以ASCII的形式存放于此向量的每一个元素中,只是他的外显形式仍然是可读的字符,字符串类型在数据的可视化、应用程序的交互方面有着非常重要的作用。 3.3.1 创建字符串 1、一般字符串的创建 在matlab中,所有的字符串都用两个单引号括起来,进行输入赋值,如在matlab命令窗口中输入以下内容,会创建一个字符串matlab。 a='matlab'

a =

matlab 字符串的每一个字符(空格也是字符)都是相应矩阵的一个元素,上述变量a是1X6的矩阵,阶数可以用size(a)命令查得;

size(a)

ans =

 1     6

2、中文字符串的创建 中文也可以作为字符串的创建,需要注意的是,在中文字符串的输入过程中,两边的单引号必须是英文状态的单引号。例如,以下代码会创建一个中文字符串。 A='中文字符串输入演示'

A =

中文字符串输入演示 3、字符串的寻访 在matlab中,字符串的寻访可以通过其坐标来实现。在一个字符串中,matlab按照从左到右的顺序对字符串中的字符依次编号(1,2,3,...)。进行字符串的寻访,只需要像寻访一般矩阵那样即可,例如上述A, A(3:5)

ans =

字符串 4.字符串数组的创建 二维字符串(数组)的建立也非常简单。要创建字符串数组,可以像数值数组的建立那样直接输入,也可以使用str2mat等函数; 例:多行字符串数组的直接输入。 clear S=['This string array' 'has multiple rows']

S =

This string array has multiple rows size(S)

ans =

 2    17

注意:在直接输入多行字符串数组的时候,每一行的字符串个数相同。 例:使用函数str2mat 创多行字符串数组。 a=str2mat('这','字符','串数组','','由5行组成')

a =


字符
串数组

由5行组成 在使用函数str2mat创建字符串数组的时候,不用担心每一行字符个数是否相等,函数在运行中会以字符最多的一行为准,而将其他行中的字符以空格补齐。 3.3.2 比较字符串 在matlab中,有多种对字符串进行比较的功能 strcmp:判断字符串是否相等, strncmp:判断两个字符串的前n个字符是否相等, strcmpi和strncmpi:这两个函数的作用分别与strcmp和strncmp相同,只是在比较的过程中忽略字母的大小写。 3.3.3 查找与替换字符串 1、使用strrep函数进行字符串查找和替换 考虑有这样一个标签 label =

Sample 1,03/28/15

newlabel=strrep(label,'28','30') 函数strrep用于实现一般的查找与替换功能,如将(“03/28”替换为“03/30”,命令如下。

newlabel =

Sample 1,03/30/15

2、使用findstr函数进行字符串查找 findstr函数用于返回某一子串在整个字符串中开始的位置,例如:要在字符串中查找字母a和oo出现的位置,可以使用如下命令; strtemp='have aa good time!'

strtemp =

have aa good time!

position1=findstr('a',strtemp)

position1 =

 2     6     7

position2=findstr('oo',strtemp)

position2 =

10

从本例可以看出,字母a的出现在2、6、7的位置,这说明findstr包括所有出现的子串的位置,而字母‘oo’出现了一次,所以只返回一个位置信息。 strtok函数用于返回分隔字符第一次出现之前的字符。如果不自行指定分隔字符,默认的分隔字符则是泛空格字符,因此用户可以使用strtok函数将一个句子按照单词分开。 例:使用strtok函数进行字符串查找; t='I have walked out a handful of movies in my life.'; %测试字符串

remain=t;
while true %使用while循环结构 [str,remain]=strtok(remain); %以默认的空格为分隔符查找 if isempty(str),break;end %循环跳出控制 disp(sprintf('%s',str)) %显示结果; end I have walked out a handful of movies in my life. 函数strmatch用于查找一个字符数组中以指定子串开始的字符串,该函数返回的是以指定子串开始的行编号。 例:使用strmatch进行字符串查找 maxstrings = strvcat('max','minimax','maximin') %测试字符串数组

maxstrings =

max
minimax maximin

strmatch('max',maxstrings) %在测试字符串数组中查找以max开头的字符串

ans =

 1
 3

本例中minimax虽然也包含max子串,但是这个子串不是max开头的,所以没有返回第二行的子串。 3.3.4 类型转换 数字与字符串之间的转换函数 num2str 将数字转换为字符串 int2str 将整数转换为字符串 mat2str 将矩阵转换为eval函数可以使用的字符串; str2double 将字符串转换为双精度类型的数据; str2num 将字符串转换为数字; sprintf 格式化输出数据到命令窗口 sscanf 读取格式化字符串

不同数值之间的转换函数 hex2num 将16进制整数字符串转换为双精度数据; hex2dec 将16进制整数字符串转换为十进制数据; dec2hex 将十进制字符串转换为十六进制整数字符串; bin2dec 将2进制字符串转换为10进制整数; dec2bin 将十进制整数转换为2进制字符串; base2dec 将指定数制类型的数字字符串转换为10进制整数; dec2base 将十进制整数转换为指定数制类型的数字字符串; 例:用法示例 a=['1 2';'3 4'] %创建一个字符串数组

a =

1 2 3 4

b=str2num(a) %将字符串转换为数值形式

b =

 1     2
 3     4

c =str2num('1+2i') %将字符串转换为数值形式

c =

1.0000 + 2.0000i

d=str2num('1 +2i') %将字符串转换为数值形式

d =

1.0000 + 0.0000i 0.0000 + 2.0000i

e=num2str(rand(3,3),6) %将数值转换为字符串形式

e =

0.814724 0.913376 0.278498 0.905792 0.632359 0.546882 0.126987 0.0975404 0.957507

whos Name Size Bytes Class Attributes a 2x3 12 char
b 2x2 32 double
c 1x1 16 double complex
d 1x2 32 double complex
e 3x34 204 char
详细信息查阅matlab的help文档