Find index of cells containing my string
2.504 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
New
el 25 de Feb. de 2011
Editada: MathWorks Support Team
el 13 de Nov. de 2024 a las 4:24
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 comentarios
Yusuf Arslan
el 26 de Sept. de 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
el 26 de Sept. de 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.
Respuesta aceptada
Jan
el 29 de Ag. de 2023
Editada: MathWorks Support Team
el 13 de Nov. de 2024 a las 4:24
Do you want to search for 'bla' within the text in each element of the cell array, or for elements that are 'bla' exactly? If you explain this detail, then your question would be easier to answer. If you are searching for text that has 'bla' as part of the text, then starting in R2016b you can use the “contains” function, as Alexander Cranney pointed out. Index = find(contains(C,'bla')); The function "contains" returns a logical array. This type of logical indexing can be used to make many workflows more efficient. For more on using logical arrays, refer to the documentation: https://www.mathworks.com/help/matlab/math/array-indexing.html#MatrixIndexingExample-3 https://www.mathworks.com/help/matlab/matlab_prog/find-array-elements-that-meet-a-condition.html In previous versions of MATLAB (before R2016b), you can use the “strfind” function. However, “strfind” returns a cell array of indices. For any input cell whose text does not contain 'bla', “strfind” returns an empty cell. Use “isempty” and “cellfun” with the “find” function to find the empty cells. IndexC = strfind(C,'bla'); Index = find(not(cellfun('isempty',IndexC))) If you are searching for text that is exactly 'bla', then see Jos’ answer.
10 comentarios
Aditi Bishnoi
el 22 de En. de 2021
what to use if I want to find the exact string match 'bla'.
My cell array has both 'bla' and 'blah' elements, but i want to pick out only 'bla'.
Walter Roberson
el 22 de En. de 2021
Editada: Walter Roberson
el 22 de En. de 2021
exact_match_mask = strcmp(YourCell, 'bla')
exact_match_locations = find(exact_match_mask)
provided that your cell entries are all character vectors.
Más respuestas (7)
Jay
el 28 de Mayo de 2016
Editada: Jay
el 28 de Mayo de 2016
This worked for me:
idx = find(ismember(C, 'bla'))
8 comentarios
per isakson
el 22 de Mayo de 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
el 13 de En. de 2022
See the second paragraph here:
Jos (10584)
el 25 de Feb. de 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 comentario
Matt B
el 14 de Nov. de 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 comentarios
Jan
el 6 de Jun. de 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
el 26 de Feb. de 2017
Faster options: count startsWith endsWith
E,g, Index = count(Mycellarray, 'Bla');
1 comentario
Jan
el 25 de Feb. de 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)
0 comentarios
Peter Farkas
el 9 de Mayo de 2016
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.
0 comentarios
Mukesh Jadhav
el 9 de Oct. de 2016
Editada: per isakson
el 10 de En. de 2017
Haven't tested but this should work fine.
word_to_find=strfind(strarray,'stringtofind');
starray.index(word_to_find);
0 comentarios
Ver también
Categorías
Más información sobre Characters and Strings en Help Center y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!