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
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文档