#Matlab# #本质分析# 使用多种方法 查找 元胞 (cell) 内指定字符串的索引 并分析局限性及陷阱

查找cell里边的字符串 常用的方法有三种。

方法一

>> C = {1,5,3,4,2,3,4,5,2,1}; 
index = find([C{:}] == 5)

index =

     2     8

方法一首先通过[C{:}]操作,将cell内的元素转化为数组,然后再对数组执行find()函数,返回要查找字符串的索引。

  • 优点

能同时检索cell内数值类型和单字符型的数据

  • 局限性

这种方法 只对数字(包括小数)单个char(单个字符) 有效。
如果对多个字符操作会出现如下错误:

>> c={'1' '5d' '3' '4' '2' '3' '4' '5' '2' '1'};
>> index = find([c{:}] == '5d')
错误使用  == 
矩阵维度必须一致。
  • 深入分析出现错误的原因(陷阱)

之所以会出现如下错误,关键在于[ ]操作
我们先来了解一下[ ]操作在不同类型数据上的区别

  1. 对于多个数值类型的变量执行[ ]操作,本质上是将所有变量放入数组之中,系统返回的是一个数值型的数组;
>> C = {1,5,3,4,2,3,4,5,2,1}; 
[C{:}]

ans =

     1     5     3     4     2     3     4     5     2     1
  1. 对于多个字符型的变量,执行[ ]操作本质上是执行了字符串拼接,返回的是一个char数组,每个数组单元内存储一个字符,长度为1
>> c={'1' '5d' '3' '4' '2' '3' '4' '5' '2' '1'};
[c{:}],class([c{:}])

ans =

15d34234521


ans =

char

此外,经试验发现,find([c{:}] == ‘5d’)语句中右边的长度必须是左边数组的单位长度
所以回到最开始的问题,语句 find([c{:}] == ‘5d’) ,等号左边是1 * n的字符数组,右边是 1 * 2的字符数组,右边的长度2不等于左边的最小单位1,所以报错:错误使用 == 矩阵维度必须一致。

方法二

>> c={'1' '5d' '3' '4' '2' '3' '4' '5' '2' '1'};
index = find(strcmp(c,'5d'))

index =

     2
  • 优点

strcmp()方法能够同时检索字符字符串

  • 局限性

strcmp()方法不能检索数值型的数据。

>> c={1,'5',3,4,2,3,4,5,2,1};index = find(strcmp(c,5))

index =

   空矩阵: 1×0

方法三

>> c={'1' '5d' '3' '4' '2' '3' '4' '5' '2' '1'};
>index = find(ismember(c,'5d'))

index =

     2
  • 优点

能够检索字符串单字符

  • 局限性

不能够检索数值类型的数据,
不能对包含混合数据类型(同时包含数值和字符或字符串)的cell进行检索。
速度较慢

>>  c={1,'5d','5',4,2,3,4,5,2,1};
idx = find(ismember(c,'5'))
错误使用 cell/ismember (line 34)
类 cell 的输入 A 和类 char 的输入 B 必须为字符串元胞数组,除非其中某个输入为字符串。

总结

通过表格总结一下三种方法的适用范围

方法 检索包含混合数据cell 检索数值型 检索单字符 检索字符串
方法一 ×
方法二 ×
方法三 × ×
发布了59 篇原创文章 · 获赞 2 · 访问量 4636

猜你喜欢

转载自blog.csdn.net/lch551218/article/details/103805042