Matlab 字符串类型
字符串的表示
- 字符串使用单引号括起来,如
A='abc'
。 - 字符串是一个行向量,如
A(1,2)
,输出ans='b'
。 - 单引号需要用两个单引号表示,如
'colors_wind''s'
。 - 可以建立字符串矩阵,如
['abc'; 'def']
,由于是矩阵,要求每行字符数目相同。 - 若一个字符串过长需要换行时,可使用
...
作为换行标志,类似 bash 中的\
,它告诉解释器下一行的内容是紧接着上一行的。
str = ['This is a char array. '...
'There is a single quotation mark '' here.']
$$ \text{ This is a char array. There is a single quotation mark ' here.} $$
字符串的操作
字符串的执行
eval
函数,把字符串作为表达式执行。同python中的 eval
函数。
t = pi/2
m = '[t,sin(t),cos(t)]'
y = eval(m)
$$ \begin{aligned} t =& \\ &1.5708 \\ m =& \\ &'[t,sin(t),cos(t)]' \\ y =&\\ &1.5708\ \ 1.0000\ \ 0.0000 \end{aligned} $$
字符串与数值类型的转换
abs
、double
获取字符串矩阵对应的ASCIi码矩阵
char
将ASCII码矩阵转化为字符串矩阵
s = 'MATLAB';
a = abs(s)
a = a + 32; % ASCII码 + 32, 即转为小写
s = char(a)
$$ \begin{aligned} a =& \\ &77\ \ 65\ \ 84\ \ 76\ \ 65\ \ 66 \\ s =& \\ & \text{'matlab'} \end{aligned} $$
字符串的比较
利用关系运算符
要求两个字符串长度相同,则依次比较字符串中的字符,结果是一个矩阵。
'aBcdeFG' < 'abcdefg'
$$ \begin{aligned} ans=\\ \\ & \text{1×7 } \bf{logical} \rm\text { array} \\ \\ & \text{0 1 0 0 0 1 1} \end{aligned} $$
字符串比较函数
strcmp(s1, s2)
比较字符串是否相等,相等返回1,否则返回0。strncmp(s1, s2, n)
比较字符串前n个字符是否相等,相等返回1,否则返回0。strcmpi(s1, s2)
在忽略大小写的前提下比较字符串是否相等,相等返回1,否则返回0。strcmpi(s1, s2, n)
在忽略大小写的前提下比较字符串前n个字符是否相等,相等返回1,否则返回0。
字符串的查找和替换
findstr(s1, s2)
返回短字符串在长字符串中的开始位置。(不推荐)strfind(s1, s2)
在s1
中查找s2
,类似Java中的s1.indexOf(s2)
,但matlab中的这个函数结果是一个向量,元素为s2
出现位置的索引从小到大排列。strep(s1, s2, s3)
将字符串中s1中的所有子字符串s2替换为s3。相当于Java中的
s1.replace(s2, s3)`strfind('12345672', '2')
$$ \begin{aligned} ans=\\ &\text{2 8} \end{aligned} $$
字符串处理实例
这个例子完成以下任务
- 取1~5字符串子列
- 求字符串反序
- 将字符串中小写字母转为大写
- 获取字符串长度
ch = 'RUEKlYu6j0qOBUVF'; % 构造字符串
subch = ch(1:5); % 取 1~5 字符串子列
revch = ch(end:-1:1); % 取 end~1 位置的字符,即反序
k = find(ch >= 'a' & revch <= 'z'); % 寻找ASCII码在'a'和'z'之间元素的下标
ch(k) = ch(k) - ('a' - 'A'); % 将字符转换为大写
length(k) % 获取向量 k 的长度
>> ch = 'RUEKlYu6j0qOBUVF' % 构造字符串
ch =
'RUEKlYu6j0qOBUVF'
>> subch = ch(1:5) % 取 1~5 字符串子列
subch =
'RUEKl'
>> revch = ch(end:-1:1) % 取 end~1 位置的字符,即反序
revch =
'FVUBOq0j6uYlKEUR'
>> k = find(ch >= 'a' & revch <= 'z') % 寻找ASCII码在'a'和'z'之间元素的下标
k =
5 7 9 11
>> ch(k) = ch(k) - ('a' - 'A') % 将字符转换为大写
ch =
'RUEKLYU6J0QOBUVF'
>> length(k) % 获取向量 k 的长度
ans =
4
运行完上面的程序,有两个疑问,于是:
>> A = [1:6]
A =
1 2 3 4 5 6
>> B = reshape(A, 2, 3)
B =
1 3 5
2 4 6
>> length(B)
ans =
3
说明 length
函数的结果是数组行数和列数中较大的一个。
继续:
>> C = reshape(A, 3, 2)
C =
1 4
2 5
3 6
>> D = (B > 3 & C < 6)
ERROR: 矩阵维度必须一致。
这说明在matlab中,这进一步说明了 find(ch >= 'a' & revch <= 'z')
的运行方式,尽管ch
和revch
是两个矩阵,但matlab要求他们具有相同的维度,从而可以以相同的方式进行处理。
更进一步地,这里实际上有两种可能的计算方式:
- 先计算
B > 3
和C < 6
得到两个矩阵,两个矩阵进行&
运算后把结果传递给find
函数。 - 同时取
B
和C
相同位置的元素执行&
运算,其余步骤同 1。
从目前的结果来看无法区分 matlab 采用哪种方式,可能第一种会更符合matlab的逻辑,但第二种效率更高。
两种方式在大多数情况下有相同的结果,除非 &
后面的表达式有副作用,而前一条表达式结果是0
,这里第一种运算方式会执行后一条表达式,而第二种运算方式由于“短路”作用不会执行后一条表达式。具体结果如何,我会在进一步的学习中讨论。