# how to find out the index of a cell array that cell contains my substring?

3 views (last 30 days)
Rui Zhang on 15 Feb 2024
Commented: Rui Zhang on 16 Feb 2024
My question is:
myCellArray = {'John','Mike','foo'};
substring = 'Jo'
Since myCellArray{1} contains "Jo', I expected the index = 1.
How to use cellfun to find the index of the element(s) in the cell array?
##### 2 CommentsShow NoneHide None
Rui Zhang on 15 Feb 2024
My Matlab version is 2017b
Rui Zhang on 15 Feb 2024
If I don't use cell function, the following code should work:
myCellArray = {'John','Mike','foo'};
substring = 'Jo';
indexForMySubstring = zeros([1,numel(myCellArray)]);
kk = 1;
for ii =1: numel(myCellArray)
if contains(myCellArray{ii},substring)
indexForMySubstring(kk) = ii;
kk = kk+1;
end
end
if kk>1.5
indexForMySubstring = indexForMySubstring(1:kk-1);
else
indexForMySubstring = [];
end
This will return array of the indexes that contains 'Jo' in myCellArray
But this code runs too slow when it is used for a large application.
I am looking for a solution that runs faster than this like using cellfun.

Sign in to comment.

### Accepted Answer

Fangjun Jiang on 15 Feb 2024
Do you have to use cellfun()?
myCellArray = {'John','Mike','foo'};
substring = 'Jo'
substring = 'Jo'
find(contains(myCellArray,substring))
ans = 1
##### 7 CommentsShow 5 older commentsHide 5 older comments
Voss on 15 Feb 2024
myCellArray = {[],'John','','Mike','foo'};
substring = 'Jo';
% replace non-char entries with empty chars:
fixedCellArray = myCellArray;
fixedCellArray(~cellfun(@ischar,fixedCellArray)) = {''};
myIndex = find(contains(fixedCellArray,substring))
myIndex = 2
Rui Zhang on 16 Feb 2024
Good solution. Thank you!

Sign in to comment.

### More Answers (1)

Aquatris on 15 Feb 2024
Edited: Aquatris on 15 Feb 2024
Using the @Fangjun Jiang example, how about
myCellArray = {'John','Mike','foo','Jonathan','Stuart','Martha','Jo'};
substring = 'Jo';
idx = find(cellfun(@(x) contains(x,substring),myCellArray,'UniformOutput',true))
idx = 1×3
1 4 7
myCellArray(idx)
ans = 1×3 cell array
{'John'} {'Jonathan'} {'Jo'}
##### 4 CommentsShow 2 older commentsHide 2 older comments
Aquatris on 15 Feb 2024
Edited: Aquatris on 16 Feb 2024
Not the cleaness solution but I think you are looking for something like this then:
myCellArray = {[] 'John','Mike',[],'foo','Johanna','Mark',[];...
0 10 11 20 30 40 50 60;...
1 12 13 22 60 70 80 20;...
2 14 15 18 40 20 10 20;...
3 15 20 25 30 40 50 60};
substring = 'Jo';
idx_empty = cellfun(@isempty,myCellArray(1,:)); % find empty cells in first row
myCellArray_Modified = myCellArray(1,:); % create replica of first row of myCellArray
myCellArray_Modified(idx_empty) = {-1}; % replace empty cells with -1 double
idx = find(cellfun(@(x) contains(string(x),substring),myCellArray_Modified(1,:),'UniformOutput',true));
idx % idx is the column numbers of interest
idx = 1×2
2 6
myCellArray(:,idx)
ans = 5×2 cell array
{'John'} {'Johanna'} {[ 10]} {[ 40]} {[ 12]} {[ 70]} {[ 14]} {[ 20]} {[ 15]} {[ 40]}
Rui Zhang on 16 Feb 2024
Thank you! It really helps me!

Sign in to comment.

### Categories

Find more on Matrices and Arrays in Help Center and File Exchange

R2017b

### Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!