Loading... # Matlab 字符串类型 <div class="tip inlineBlock info"> 相关视频 https://www.bilibili.com/video/BV19J411W7Ta?p=8 </div> ## 字符串的表示 1. 字符串使用单引号括起来,如`A='abc'`。 2. 字符串是一个行向量,如`A(1,2)`,输出`ans='b'`。 3. 单引号需要用两个单引号表示,如`'colors_wind''s'`。 4. 可以建立字符串矩阵,如 `['abc'; 'def']`,由于是矩阵,要求每行字符数目相同。 5. 若一个字符串过长需要换行时,可使用 `...` 作为换行标志,类似 bash 中的`\`,它告诉解释器下一行的内容是紧接着上一行的。 ```matlab str = ['This is a char array. '... 'There is a single quotation mark '' here.'] ``` <div class="panel panel-default collapse-panel box-shadow-wrap-lg"><div class="panel-heading panel-collapse" data-toggle="collapse" data-target="#collapse-57ff9cd34a7a6f26517448022fe8b9d85" aria-expanded="true"><div class="accordion-toggle"><span style="">输出</span> <i class="pull-right fontello icon-fw fontello-angle-right"></i> </div> </div> <div class="panel-body collapse-panel-body"> <div id="collapse-57ff9cd34a7a6f26517448022fe8b9d85" class="collapse collapse-content"><p></p> $$ \text{ This is a char array. There is a single quotation mark ' here.} $$ <p></p></div></div></div> ## 字符串的操作 ### 字符串的执行 `eval` 函数,把字符串作为表达式执行。同python中的 `eval` 函数。 ```matlab t = pi/2 m = '[t,sin(t),cos(t)]' y = eval(m) ``` <div class="panel panel-default collapse-panel box-shadow-wrap-lg"><div class="panel-heading panel-collapse" data-toggle="collapse" data-target="#collapse-98b9f077e787c49db2a6fddb9fde0c6458" aria-expanded="true"><div class="accordion-toggle"><span style="">输出</span> <i class="pull-right fontello icon-fw fontello-angle-right"></i> </div> </div> <div class="panel-body collapse-panel-body"> <div id="collapse-98b9f077e787c49db2a6fddb9fde0c6458" class="collapse collapse-content"><p></p> $$ \begin{aligned} t =& \\ &1.5708 \\ m =& \\ &'[t,sin(t),cos(t)]' \\ y =&\\ &1.5708\ \ 1.0000\ \ 0.0000 \end{aligned} $$ <p></p></div></div></div> ### 字符串与数值类型的转换 `abs`、`double`获取字符串矩阵对应的ASCIi码矩阵 `char` 将ASCII码矩阵转化为字符串矩阵 ```matlab s = 'MATLAB'; a = abs(s) a = a + 32; % ASCII码 + 32, 即转为小写 s = char(a) ``` <div class="panel panel-default collapse-panel box-shadow-wrap-lg"><div class="panel-heading panel-collapse" data-toggle="collapse" data-target="#collapse-0fb142b352aba601c494dfc822c1866b15" aria-expanded="true"><div class="accordion-toggle"><span style="">输出</span> <i class="pull-right fontello icon-fw fontello-angle-right"></i> </div> </div> <div class="panel-body collapse-panel-body"> <div id="collapse-0fb142b352aba601c494dfc822c1866b15" class="collapse collapse-content"><p></p> $$ \begin{aligned} a =& \\ &77\ \ 65\ \ 84\ \ 76\ \ 65\ \ 66 \\ s =& \\ & \text{'matlab'} \end{aligned} $$ <p></p></div></div></div> ## 字符串的比较 ### 利用关系运算符 要求两个字符串长度相同,则依次比较字符串中的字符,结果是一个矩阵。 ```matlab 'aBcdeFG' < 'abcdefg' ``` <div class="panel panel-default collapse-panel box-shadow-wrap-lg"><div class="panel-heading panel-collapse" data-toggle="collapse" data-target="#collapse-4a4974e4df4b5b274920de0aada580e555" aria-expanded="true"><div class="accordion-toggle"><span style="">输出</span> <i class="pull-right fontello icon-fw fontello-angle-right"></i> </div> </div> <div class="panel-body collapse-panel-body"> <div id="collapse-4a4974e4df4b5b274920de0aada580e555" class="collapse collapse-content"><p></p> $$ \begin{aligned} ans=\\ \\ & \text{1×7 } \bf{logical} \rm\text { array} \\ \\ & \text{0 1 0 0 0 1 1} \end{aligned} $$ <p></p></div></div></div> ### 字符串比较函数 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)` ```matlab strfind('12345672', '2') ``` <div class="panel panel-default collapse-panel box-shadow-wrap-lg"><div class="panel-heading panel-collapse" data-toggle="collapse" data-target="#collapse-41814d9b1e5fbfa05026fa3721389aae17" aria-expanded="true"><div class="accordion-toggle"><span style="">输出</span> <i class="pull-right fontello icon-fw fontello-angle-right"></i> </div> </div> <div class="panel-body collapse-panel-body"> <div id="collapse-41814d9b1e5fbfa05026fa3721389aae17" class="collapse collapse-content"><p></p> $$ \begin{aligned} ans=\\ &\text{2 8} \end{aligned} $$ <p></p></div></div></div> ## 字符串处理实例 这个例子完成以下任务 1. 取1~5字符串子列 2. 求字符串反序 3. 将字符串中小写字母转为大写 4. 获取字符串长度 ```matlab 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 的长度 ``` <div class="panel panel-default collapse-panel box-shadow-wrap-lg"><div class="panel-heading panel-collapse" data-toggle="collapse" data-target="#collapse-0725aa644eecbb14dd872ff8b3f092a688" aria-expanded="true"><div class="accordion-toggle"><span style="">运行实例</span> <i class="pull-right fontello icon-fw fontello-angle-right"></i> </div> </div> <div class="panel-body collapse-panel-body"> <div id="collapse-0725aa644eecbb14dd872ff8b3f092a688" class="collapse collapse-content"><p></p> ```matlab >> 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 ``` <p></p></div></div></div> <div class="panel panel-default collapse-panel box-shadow-wrap-lg"><div class="panel-heading panel-collapse" data-toggle="collapse" data-target="#collapse-777f349796793772af9a59477b964daf85" aria-expanded="true"><div class="accordion-toggle"><span style="">作者的一点思考(点击展开)</span> <i class="pull-right fontello icon-fw fontello-angle-right"></i> </div> </div> <div class="panel-body collapse-panel-body"> <div id="collapse-777f349796793772af9a59477b964daf85" class="collapse collapse-content"><p></p> 运行完上面的程序,有两个疑问,于是: ```matlab >> 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` 函数的结果是数组行数和列数中较大的一个。 继续: ```matlab >> C = reshape(A, 3, 2) C = 1 4 2 5 3 6 >> D = (B > 3 & C < 6) ERROR: 矩阵维度必须一致。 ``` <div class="tip inlineBlock warning"> 以下内容只是作者的看法,并不一定准确。 </div> 这说明在matlab中,这进一步说明了 `find(ch >= 'a' & revch <= 'z')` 的运行方式,尽管`ch` 和`revch`是两个矩阵,但matlab要求他们具有相同的维度,从而可以以相同的方式进行处理。 更进一步地,这里实际上有两种可能的计算方式: 1. 先计算 `B > 3` 和 `C < 6` 得到两个矩阵,两个矩阵进行 `&` 运算后把结果传递给 `find` 函数。 2. 同时取 `B` 和 `C` 相同位置的元素执行 `&` 运算,其余步骤同 1。 从目前的结果来看无法区分 matlab 采用哪种方式,可能第一种会更符合matlab的逻辑,但第二种效率更高。 两种方式在大多数情况下有相同的结果,除非 `&` 后面的表达式有副作用,而前一条表达式结果是`0`,这里第一种运算方式会执行后一条表达式,而第二种运算方式由于“短路”作用不会执行后一条表达式。具体结果如何,我会在进一步的学习中讨论。 <p></p></div></div></div> 最后修改:2020 年 05 月 11 日 © 允许规范转载 赞 0 如果觉得我的文章对你有用,请随意赞赏