查找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')
错误使用 ==
矩阵维度必须一致。
之所以会出现如下错误,关键在于[ ]操作。
我们先来了解一下[ ]操作在不同类型数据上的区别
- 对于多个数值类型的变量执行[ ]操作,本质上是将所有变量放入数组之中,系统返回的是一个数值型的数组;
>> C = {1,5,3,4,2,3,4,5,2,1};
[C{:}]
ans =
1 5 3 4 2 3 4 5 2 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 | 检索数值型 | 检索单字符 | 检索字符串 |
---|---|---|---|---|
方法一 | √ | √ | √ | × |
方法二 | √ | × | √ | √ |
方法三 | × | × | √ | √ |