Matlab 字符串类型

字符串的表示

  1. 字符串使用单引号括起来,如A='abc'
  2. 字符串是一个行向量,如A(1,2),输出ans='b'
  3. 单引号需要用两个单引号表示,如'colors_wind''s'
  4. 可以建立字符串矩阵,如 ['abc'; 'def'],由于是矩阵,要求每行字符数目相同。
  5. 若一个字符串过长需要换行时,可使用 ... 作为换行标志,类似 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} $$

字符串与数值类型的转换

absdouble获取字符串矩阵对应的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} $$

字符串比较函数

  1. strcmp(s1, s2) 比较字符串是否相等,相等返回1,否则返回0。
  2. strncmp(s1, s2, n)比较字符串前n个字符是否相等,相等返回1,否则返回0。
  3. strcmpi(s1, s2) 在忽略大小写的前提下比较字符串是否相等,相等返回1,否则返回0。
  4. strcmpi(s1, s2, n) 在忽略大小写的前提下比较字符串前n个字符是否相等,相等返回1,否则返回0。

字符串的查找和替换

  1. findstr(s1, s2) 返回短字符串在长字符串中的开始位置。(不推荐)
  2. strfind(s1, s2)s1中查找s2,类似Java中的s1.indexOf(s2),但matlab中的这个函数结果是一个向量,元素为s2出现位置的索引从小到大排列。
  3. strep(s1, s2, s3) 将字符串中s1中的所有子字符串s2替换为s3。相当于Java中的s1.replace(s2, s3)`

    strfind('12345672', '2')

输出

$$ \begin{aligned} ans=\\ &\text{2 8} \end{aligned} $$

字符串处理实例

这个例子完成以下任务

  1. 取1~5字符串子列
  2. 求字符串反序
  3. 将字符串中小写字母转为大写
  4. 获取字符串长度
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') 的运行方式,尽管chrevch是两个矩阵,但matlab要求他们具有相同的维度,从而可以以相同的方式进行处理。

更进一步地,这里实际上有两种可能的计算方式:

  1. 先计算 B > 3C < 6 得到两个矩阵,两个矩阵进行 & 运算后把结果传递给 find 函数。
  2. 同时取 BC 相同位置的元素执行 & 运算,其余步骤同 1。

从目前的结果来看无法区分 matlab 采用哪种方式,可能第一种会更符合matlab的逻辑,但第二种效率更高。

两种方式在大多数情况下有相同的结果,除非 & 后面的表达式有副作用,而前一条表达式结果是0,这里第一种运算方式会执行后一条表达式,而第二种运算方式由于“短路”作用不会执行后一条表达式。具体结果如何,我会在进一步的学习中讨论。

最后修改:2020 年 05 月 11 日
如果觉得我的文章对你有用,请随意赞赏