Matlab 的基本数据类型——字符类型
1 字符串的创建
注意:字符串就是字符数组。(数组内部的元素可以是数字,也可以是字符,前者是数字型数组,后者是字符型数组)
在MATLAB中创建一个字符串非常简单。 例如,在命令提示符下键入以下内容:
>> my_string = 'gdcp'
my_string =
'gdcp'
% MATLAB将所有变量视为数组,并将字符串视为字符数组。
% 使用whos命令来检查上面创建的变量
>> whos
Name Size Bytes Class Attributes
my_string 1x4 8 char
有趣的是,使用uint8或uint16等数字转换函数可以将字符串中的字符转换为数字。 反之,char函数将整数向量转换回到字符。
示例:
my_string = 'abcd dcba!';
str_ascii = uint8(my_string) % 8-bit ascii values
str_back_to_char= char(str_ascii)
str_16bit = int16(my_string) % 16-bit ascii values
str_back_to_char= char(str_16bit)
执行上面示例代码,得到以下结果 :
2 字符矩阵
到目前为止,我们讨论的字符串是一维字符数组; 然而,我们需要存储更多维度的数据。在程序中存储更多的维度文本数据。这是通过创建矩形字符数组来实现的。
创建矩形字符阵列的最简单的方式是根据需要垂直或水平连接两个或更多个一维字符数组。
(1)可以通过以下任一方式水平组合字符串 -
方法1:可使用运算符 [ ] 创建矩阵,并用逗号 ( ,) 或空格分隔矩阵内的各个字符串。该方法保留输入数组中的任何尾随空格。
方法2:可使用字符串连接函数 strcat( )。 注意此方法会删除输入中的尾随空格。
s1 = 'cui ';
s2 = 'chun ';
s3 = 'lei ';
str1 = [s1 ,s2 , s3]
str2 = strcat(s1 , s2 , s3)
运行结果:
(2)通过以下任一方式垂直组合字符串
方法1:可使用运算符 [ ] 创建矩阵,并用分号( ; )分隔每一行。注意,在这种方法中,每行必须包含相同数量的字符。对于不同长度的字符串,应该根据需要填充空格字符。
方法2:使用char函数把几个字符串垂直组成字符矩阵。注意,如果字符串的长度不同,则char将较短的字符串填充到尾部空白处,以使每行具有相同的字符数。
s1= 'cui ';
s2= 'chun ';
s3= 'lei ';
str1 = [s1 ; s2 ; s3]
str2 = char(s1 , s2 , s3)
运行结果:
3 MATLAB中的字符串函数
MATLAB提供了许多字符串函数来创建,组合,解析,比较和操作字符串。
下表简要介绍了MATLAB中的字符串函数。
函数 | 描述 |
char | 把数字等转换为字符数组(字符串) |
blanks | 创建空白字符串 |
sprintf | 将数据格式化为字符串 |
strcat | 水平连接字符串 |
strjoin | 将单元格中的字符串连接到单个字符串中 |
ischar | 确定项目是否是字符数组 |
isletter | 数组元素是否为字母 |
isspace | 数组元素是否为空格 |
cellstr | 从字符数组创建字符串数组 |
iscellstr | 确定输入是字符串的单元格数组 |
strfind | 在另一个字符串中查找一个字符串 |
strrep | 查找并替换子串 |
strsplit | 在指定的分隔符处拆分字符串 |
strtok | 字符串的选定部分 |
validatestring | 检查文本字符串的有效性 |
symvar | 确定表达式中的符号变量 |
regexp | 匹配正则表达式(区分大小写) |
regexpi | 匹配正则表达式(不区分大小写) |
regexprep | 用正则表达式替换字符串 |
regexptranslate | 用正则表达式替换字符串 |
例1:字符串连接 :strjoin
指的是把几个字符串用某个“符号”串接起来
str_array = {'red','blue','green', 'yellow', 'orange'};
str1 =strjoin(str_array , "@")
str2 =strjoin(str_array , " ")
执行上面示例代码,得到以下结果 -
str1 = 'red@blue@green@yellow@orange'
str2 = 'red blue green yellow orange'
例2:strrep 查找并替换子串
str= '1+2=4 is correct' ;
new_str = strrep( str , 'correct' , 'wrong' )
输出:
new_str = '1+2=4 is wrong'
例3:使用strfind查找字符串
strfind(string,pattern)——查找字符串string中是否包含pattern子串;
如果包含返回子串位置,否则返回空数组。
1 2 3 4 | s = 'matlab is a very good software';
pl = 'is';
strfind(s,pl)
|
字符串比较的函数 :
函数 | 描述 |
strcmp | 比较字符串(区分大小写) |
strcmpi | 比较字符串(不区分大小写) |
strncmp | 比较字符串的前n个字符(区分大小写) |
strncmpi | 比较字符串的前n个字符(不区分大小写) |
例1:strcmp 比较字符串(区分大小写)
%当两个字符不相等时
s1 = 'Yes';
s2 = 'Yea';
tf = strcmp(s1,s2)
tf = logical
0
%当两个字符相等时
s1 = 'Yes';
s2 = 'Yes';
tf = strcmp(s1,s2)
tf = logical
1
例2:
s1 = 'matlab';
s2 = 'matlab';
s3 = 'matlab is very good';
s4 = 'MATLAB';
s5 = 'MATLAB IS VERY GOOD';
strcmp(s1, s2) % 1
strcmp(s1, s3) % 0
strcmp(s1, s4) % 0
strcmpi(s1, s4) %1
strncmp(s1, s3, 6) % 1
strcmpi( s3, s5) % 1
strncmpi(s1, s5, 6) % 1
将字符串更改为大写或小写,创建或删除空格的函数:
函数 | 描述 |
deblank | 从字符串末尾剥去尾随空格 |
strtrim | 从字符串中删除前导和尾随的空格 |
lower | 将字符串转换为小写 |
upper | 将字符串转换为大写字母 |
strjust | 对齐字符数组 |
==========================================
字符串数组总结:
(1)使用方括号[ ] 水平串联字符串
1 2 3 4 5 6 7 8 9 10 | s1 = 'MATLAB';
s2 = ' is';
s3 = ' a very good';
s4 = ' software';
s = [s1,s2,s3,s4];
disp(s) % MATLAB is a very good software
|
(2)使用strcat函数串联多个字符串
strcat(子串1,子串2,....,子串n)
使用strcat函数连接字符串时,每个字符串的最右侧空格会被忽略。
1 2 3 4 5 6 7 | s1 = 'MATLAB';
s2 = ' is';
s3 = ' a very good';
s4 = ' software';
s = strcat(s1,s2,s3,s4);
disp(s) %MATLAB is a very good software
|
(3)使用[ ] 括号垂直拼接多个字符串
要求每行的长度要求一致,不足空格来补。
1 2 3 4 5 6 7 | s1 = 'MATLAB ';
s2 = ' is ';
s3 = ' a very good';
s4 = ' software ';
s = [s1;s2;s3;s4];
size(s)
|
(4)使用strvcat构建多行字符串(过时,尽量不用)
strvcat(子串1,子串2,...,子串n)——不要求每行的长度一致
若有一行是空字符串,那么会被忽略掉。
1 2 3 4 5 6 | s1 = 'MATLAB';
s2 = ' is';
s3 = ' a very good';
s4 = ' software';
s = strvcat(s1,s2,s3,s4);
|
(5)使用char构建多行字符串
char(子串1,子串2,...,子串n)
空字符串不会被忽略掉,会用空格填满所要求的长度。
1 2 3 4 5 6 7 8 | s1 = 'MATLAB';
s2 = ' is';
s3 = ' a very good';
s4 = ' software';
s = char(s1,s2,s3,s4);
size(s) % 4 12
s
|
(6)使用函数比较字符串
strcmp(a,b)——比较字符串a,b是否完全相同
strcmpi(a,b)——比较字符串a,b在忽略大小写的情况下是否完全相同
strncmp(a,b,n)——比较字符串a,b的前n个字符是否完全相同
strncmpi(a,b,n)——比较字符串a,b的前n个字符在忽略大小写的情况下是否完全相同
1 2 3 4 5 6 7 8 9 10 11 12 | s1 = 'matlab';
s2 = 'matlab';
s3 = 'matlab is very good';
s4 = 'MATLAB';
s5 = 'MATLAB IS VERY GOOD';
strcmp(s1,s2) % 1
strcmp(s1,s3) % 0
strcmp(s1,s4) % 0
strncmp(s1,s3,6) % 1
strcmpi(s3,s5) % 1
strncmpi(s1,s5,6) % 1
|
(7)使用等号比较字符串
== 比较的每个字符中的元素相比较
1 2 3 4 5 6 7 8 | s1 = 'MATLAB';
s2 = 'matlab';
s3 = 'm';
s4 = 'a';
s1 == s2
s2 == s3
s2 == s4
|
(8)使用strfind查找字符串
strfind(string,pattern)——查找字符串string中是否包含pattern子串;
如果包含返回子串位置,否则返回空数组。
1 2 3 4 | s = 'matlab is a very good software';
pl = 'is';
strfind(s,pl) % 8
|
(9)使用strrep替换字符串
sNew = strrep(s,s1,s2)——把字符串s中的s1替换成s2
要有返回值(新字符串);该函数区分大小写;有几个换几个。
1 2 3 4 5 6 7 | s = 'matlab is a very good software';
s1 = 'matlab';
s2 = 'MATLAB';
sNew = strrep(s,s1,s2);
s
sNew
|
tips: eval( ) 函数
eval( ) 函数可以将字符串内容当成matlab命令来执行。
======================================
课外拓展:ASCII码简介
1、ASCII码 是现今最通用的单字节编码系统,并等同于国际标准ISO/IEC 646
ASCII码分为三类:ASCII 控制字符 ,ASCII 打印字符,ASCII扩展码
ASCII 打印字符 (字符编码: 32-127)
32~126(共95个)是字符:32是空格,其中48~57为0到9十个阿拉伯数字,65~90为26个大写英文字母,97~122号为26个小写英文字母,其余为一些标点符号、运算符号等。第127个字符表示的是键盘上的删除命令。
32 | 040 | 20 | 00100000 |
|   | 空格 |
33 | 041 | 21 | 00100001 | ! | ! | 感叹号 |
34 | 042 | 22 | 00100010 | " | " | 双引号 |
35 | 043 | 23 | 00100011 | # | # | 井号 |
36 | 044 | 24 | 00100100 | $ | $ | 美元符 |
37 | 045 | 25 | 00100101 | % | % | 百分号 |
38 | 046 | 26 | 00100110 | & | & | 与 |
39 | 047 | 27 | 00100111 | ' | ' | 单引号 |
40 | 050 | 28 | 00101000 | ( | ( | 左括号 |
41 | 051 | 29 | 00101001 | ) | ) | 右括号 |
42 | 052 | 2A | 00101010 | * | * | 星号 |
43 | 053 | 2B | 00101011 | + | + | 加号 |
44 | 054 | 2C | 00101100 | , | , | 逗号 |
45 | 055 | 2D | 00101101 | - | - | 连字号或减号 |
46 | 056 | 2E | 00101110 | . | . | 句点或小数点 |
47 | 057 | 2F | 00101111 | / | / | 斜杠 |
48 | 060 | 30 | 00110000 | 0 | 0 | 0 |
49 | 061 | 31 | 00110001 | 1 | 1 | 1 |
50 | 062 | 32 | 00110010 | 2 | 2 | 2 |
51 | 063 | 33 | 00110011 | 3 | 3 | 3 |
52 | 064 | 34 | 00110100 | 4 | 4 | 4 |
53 | 065 | 35 | 00110101 | 5 | 5 | 5 |
54 | 066 | 36 | 00110110 | 6 | 6 | 6 |
55 | 067 | 37 | 00110111 | 7 | 7 | 7 |
56 | 070 | 38 | 00111000 | 8 | 8 | 8 |
57 | 071 | 39 | 00111001 | 9 | 9 | 9 |
58 | 072 | 3A | 00111010 | : | : | 冒号 |
59 | 073 | 3B | 00111011 | ; | ; | 分号 |
60 | 074 | 3C | 00111100 | < | < | 小于 |
61 | 075 | 3D | 00111101 | = | = | 等号 |
62 | 076 | 3E | 00111110 | > | > | 大于 |
63 | 077 | 3F | 00111111 | ? | ? | 问号 |
64 | 100 | 40 | 01000000 | @ | @ | 电子邮件符号 |
65 | 101 | 41 | 01000001 | A | A | 大写字母 A |
66 | 102 | 42 | 01000010 | B | B | 大写字母 B |
67 | 103 | 43 | 01000011 | C | C | 大写字母 C |
68 | 104 | 44 | 01000100 | D | D | 大写字母 D |
69 | 105 | 45 | 01000101 | E | E | 大写字母 E |
70 | 106 | 46 | 01000110 | F | F | 大写字母 F |
71 | 107 | 47 | 01000111 | G | G | 大写字母 G |
72 | 110 | 48 | 01001000 | H | H | 大写字母 H |
73 | 111 | 49 | 01001001 | I | I | 大写字母 I |
74 | 112 | 4A | 01001010 | J | J | 大写字母 J |
75 | 113 | 4B | 01001011 | K | K | 大写字母 K |
76 | 114 | 4C | 01001100 | L | L | 大写字母 L |
77 | 115 | 4D | 01001101 | M | M | 大写字母 M |
78 | 116 | 4E | 01001110 | N | N | 大写字母 N |
79 | 117 | 4F | 01001111 | O | O | 大写字母 O |
80 | 120 | 50 | 01010000 | P | P | 大写字母 P |
81 | 121 | 51 | 01010001 | Q | Q | 大写字母 Q |
82 | 122 | 52 | 01010010 | R | R | 大写字母 R |
83 | 123 | 53 | 01010011 | S | S | 大写字母 S |
84 | 124 | 54 | 01010100 | T | T | 大写字母 T |
85 | 125 | 55 | 01010101 | U | U | 大写字母 U |
86 | 126 | 56 | 01010110 | V | V | 大写字母 V |
87 | 127 | 57 | 01010111 | W | W | 大写字母 W |
88 | 130 | 58 | 01011000 | X | X | 大写字母 X |
89 | 131 | 59 | 01011001 | Y | Y | 大写字母 Y |
90 | 132 | 5A | 01011010 | Z | Z | 大写字母 Z |
91 | 133 | 5B | 01011011 | [ | [ | 左中括号 |
92 | 134 | 5C | 01011100 |
| \ | 反斜杠 |
93 | 135 | 5D | 01011101 | ] | ] | 右中括号 |
94 | 136 | 5E | 01011110 | ^ | ^ | 音调符号 |
95 | 137 | 5F | 01011111 | _ | _ | 下划线 |
96 | 140 | 60 | 01100000 | ` | ` | 重音符 |
97 | 141 | 61 | 01100001 | a | a | 小写字母 a |
98 | 142 | 62 | 01100010 | b | b | 小写字母 b |
99 | 143 | 63 | 01100011 | c | c | 小写字母 c |
100 | 144 | 64 | 01100100 | d | d | 小写字母 d |
101 | 145 | 65 | 01100101 | e | e | 小写字母 e |
102 | 146 | 66 | 01100110 | f | f | 小写字母 f |
103 | 147 | 67 | 01100111 | g | g | 小写字母 g |
104 | 150 | 68 | 01101000 | h | h | 小写字母 h |
105 | 151 | 69 | 01101001 | i | i | 小写字母 i |
106 | 152 | 6A | 01101010 | j | j | 小写字母 j |
107 | 153 | 6B | 01101011 | k | k | 小写字母 k |
108 | 154 | 6C | 01101100 | l | l | 小写字母 l |
109 | 155 | 6D | 01101101 | m | m | 小写字母 m |
110 | 156 | 6E | 01101110 | n | n | 小写字母 n |
111 | 157 | 6F | 01101111 | o | o | 小写字母 o |
112 | 160 | 70 | 01110000 | p | p | 小写字母 p |
113 | 161 | 71 | 01110001 | q | q | 小写字母 q |
114 | 162 | 72 | 01110010 | r | r | 小写字母 r |
115 | 163 | 73 | 01110011 | s | s | 小写字母 s |
116 | 164 | 74 | 01110100 | t | t | 小写字母 t |
117 | 165 | 75 | 01110101 | u | u | 小写字母 u |
118 | 166 | 76 | 01110110 | v | v | 小写字母 v |
119 | 167 | 77 | 01110111 | w | w | 小写字母 w |
120 | 170 | 78 | 01111000 | x | x | 小写字母 x |
121 | 171 | 79 | 01111001 | y | y | 小写字母 y |
122 | 172 | 7A | 01111010 | z | z | 小写字母 z |
123 | 173 | 7B | 01111011 | { | { | 左大括号 |
124 | 174 | 7C | 01111100 | | | | | 垂直线 |
125 | 175 | 7D | 01111101 | } | } | 右大括号 |
126 | 176 | 7E | 01111110 | ~ | ~ | 波浪号 |
127 | 177 | 7F | 01111111 |
|  | 删除 |
字符(char)和字符串(string)的区别:
另外,双引号和单引号在处理转义字符时也有差异。在Matlab中,双引号允许使用转义字符表示特殊字符,如换行符、制表符 等。而单引号不支持转义字符,它将特殊字符视为普通字符对待。例如,使用双引号定义一个包含转义字符的字符串:str3 "This is a new line
This is a tab "; 这样str3将显示为两行文本,第一行是"This is a new line",第二行是"This is a tab"。而如果使用单引号定义相同的字符串,转义字符将被视为普通字符,结果将是一个包含转义字符的字符串。
例:编程时可使用""与+运算符快速生成n个文件名。
练习:
S1="ABCD"
S2="DEFG"
S3="my name is ""tom"".and your name is?"
S4=S1+S2+S3
S5=strcat(S1,S2,S3)
S6=[S1,S2,S3]
S7=[S1;S2;S3]
S1='ABCD'
S2='DEFG'
S3='my name is ""tom"".and your name is?'
S4=S1+S2
S5=strcat(S1,S2,S3)
S6=[S1,S2,S3]
S7=[S1;S2;S3]