Find index of cells containing my string
Mostra commenti meno recenti
Hi, I have a cell aray (40,000X1)in which every cell contains a string. I would like to find the indexes of the cells containing a specific string. I used the following: Index = strfind(Mycellarray, 'Bla'); I get the following error: ??? Error using ==> cell.strfind at 35 If any of the input arguments are cell arrays, the first must be a cell array of strings and the second must be a character array. What is wrong, in the help file strfind accepts cell arrays and a pattern...? Thank you
7 Commenti
Walter Roberson
il 25 Feb 2011
What version are you using?
>> Mycellarray = {'hello';'what';'is';'Bla';'about'};
>> strfind(Mycellarray,'Bla')
ans =
[]
[]
[]
[1]
[]
I will wildly speculate that you have a cell array in which each element is a cell array that contains a string.
Jos (10584)
il 25 Feb 2011
Are you really sure you have a cell array of strings? Check it with ISCELLSTR
If this is not true, then you need to convert it first to be able to use STRFIND. For instance, if Walter is right and you have a cell array of a cell array of strings,
C = { {'a'}, {'b'}, {'c'}, {'a'}, {'a'} }
iscellstr(C) % false !
% ... but in this particular case it is easy to convert:
C2 = [C{:}]
and perhaps STRCMP better suits your needs as it will return a logical array directly
strcmp(C2,'a')
New
il 25 Feb 2011
Felipe
il 22 Feb 2013
I found out that if the cell has empty indexes it wont work. Example:
a =
'hey'
'oh'
[]
>> strfind(a,'hey')
??? Error using ==> cell.strfind at 35 If any of the input arguments are cell arrays, the first must be a cell array of strings and the second must be a character array.
>> a{3} = 'letsGo'
a =
'hey'
'oh'
'letsGo'
>> strfind(a,'hey')
ans =
[1]
[]
[]
It is not considered as a cell string if all the cells in the array have a string in them.
Jan
il 22 Feb 2013
@Felipe: Exactly. A cell is a cell string, if it contains strings only. And STRFIND works on strings and cell strings only.
Yusuf Arslan
il 26 Set 2017
Hello, I have got a similar Problem.
- find(strcmp(rawdata,'ggiBoundaries1(1,1)'))
I want to find in rawdata the first entry of ggiBoundaries1. But it doesn't work. The error message is =
"0×1 empty double column vector".
When I enter "ggiBoundaries1(1,1)" the output is a char. Maybe that's the problem or not?
Jan
il 26 Set 2017
This is not an error message. It simply tells you, that the string is not found.
Are you really looking for the string 'ggiBoundaries1(1,1)' ? Or do you mean:
find(strcmp(rawdata, ggiBoundaries1(1,1)))
to search for occurrences of the first character of the variable ggiBoundaries1?
Please do not append a new question to an existing thread. Better open a new one. Thanks.
Risposta accettata
Più risposte (7)
This worked for me:
idx = find(ismember(C, 'bla'))
8 Commenti
Narayanan Rengaswamy
il 4 Ott 2016
Great! Works clean. Thanks.
Cameron Kimbrough
il 10 Ott 2016
Nice, just what I was looking for.
Omer Moussaffi
il 19 Apr 2017
And this is faster, too. On my lenovo T460s, a search of a 3000-long cellstring takes about 0.5ms, compared with 2ms with
idx = find(contains(C,'bla'))
juliette Grimaldi
il 20 Dic 2017
Great, thanks! Old stuff still makes it !
Einat
il 5 Giu 2019
Yes! Worked just like I needed it to.
ANKUR WADHWA
il 17 Gen 2020
Modificato: per isakson
il 22 Mag 2020
Doesn't work on this one
C = { {'a'}, {'b'}, {'c'}, {'a'}, {'a'};{'b'}, {'a'}, {'c'}, {'a'}, {'c'} }
idx = find(strcmp([C{:}], 'a'))
Returns
idx = 1 4 7 8 9
Any suggestion on how to solve it.
per isakson
il 22 Mag 2020
It works as documented.
First see Row- and column-major order
Matlab uses column-major order. (I fail to find a page to link to in the documentation.)
Try
%%
C = { {'a'}, {'b'}, {'c'}, {'a'}, {'a'}
{'b'}, {'a'}, {'c'}, {'a'}, {'c'} };
%%
cac = [C{:}]
idx = find(strcmp( cac, 'a' ))
%%
C1 = permute( C, [2,1] ); % switch rows and columns
idx = find(strcmp( [C1{:}], 'a' ))
it outputs
cac =
1×10 cell array
Columns 1 through 8
{'a'} {'b'} {'b'} {'a'} {'c'} {'c'} {'a'} {'a'}
Columns 9 through 10
{'a'} {'c'}
idx =
1 4 7 8 9
idx =
1 4 5 7 9
Cris LaPierre
il 13 Gen 2022
See the second paragraph here:
Jos (10584)
il 25 Feb 2011
So, your original array was a cell array of cells with a single string. Use STRCMP and FIND to get the indices of the cells with a cell containing the specified string
C = { {'a'}, {'b'}, {'c'}, {'a'}, {'a'} } % data
idx = find(strcmp([C{:}], 'a')) % single line engine
1 Commento
AATIQ OUSSAMA
il 16 Apr 2017
Thanks Jos , It works fine !
Matt B
il 14 Nov 2013
I realize this question is old now, but a simple way of doing this is to define an inline function:
cellfind = @(string)(@(cell_contents)(strcmp(string,cell_contents)));
You can then use this with cellfun to return a boolean value for each element of the cell. For example:
cell_array={1,eye(2),true,'foo',10};
string='foo'
logical_cells = cellfun(cellfind('foo'),cell_array)
logical_cells =
[0,0,0,1,0]
3 Commenti
Sepp
il 27 Feb 2016
Great answer. Works very well.
josh gore
il 26 Gen 2017
The inline function was a life saver!
Jan
il 6 Giu 2019
@Matt B: strcmp accepts a cell array directly, so you can avoid the complicated cellfun approach with the expensive anonymous function:
cell_array = {1,eye(2),true,'foo',10}
strcmp(cell_array, 'foo')
>> [0,0,0,1,0]
Omer Moussaffi
il 26 Feb 2017
5 voti
Faster options: count startsWith endsWith
E,g, Index = count(Mycellarray, 'Bla');
1 Commento
Walter Roberson
il 26 Feb 2017
Yes, this method should work well starting from R2016b.
Jan
il 25 Feb 2011
You can check if your cell is a cell string:
iscellstr(Mycellarray);
This displays the indices and contents of the non-strings:
Index = find(~cellfun('isclass', Mycellarray, 'char'))
disp(Mycellarray(Index));
Another idea is, that some strings are multi-row CHAR matrices:
Index = find(cellfun('size', Mycellarray, 1) > 1)
Peter Farkas
il 9 Mag 2016
0 voti
You can also explicitelly define the index matrix:
[rw, ~] = size(cellArray);
ind = [1:1:rw];
idx = strcmp(cellArray, stringToSearchFor);
yourResult = ind(idx);
It is kind of verbose, if you review the code in 2 years time, you will still know what is going on.
Mukesh Jadhav
il 9 Ott 2016
Modificato: per isakson
il 10 Gen 2017
Haven't tested but this should work fine.
word_to_find=strfind(strarray,'stringtofind');
starray.index(word_to_find);
Categorie
Scopri di più su Characters and Strings in Centro assistenza e File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!