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

3 vues (au cours des 30 derniers jours)
Rui Zhang le 15 Fév 2024
Commenté : Rui Zhang le 16 Fév 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 commentairesAfficher AucuneMasquer Aucune
Rui Zhang le 15 Fév 2024
My Matlab version is 2017b
Rui Zhang le 15 Fév 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.

Connectez-vous pour commenter.

### Réponse acceptée

Fangjun Jiang le 15 Fév 2024
Do you have to use cellfun()?
myCellArray = {'John','Mike','foo'};
substring = 'Jo'
substring = 'Jo'
find(contains(myCellArray,substring))
ans = 1
##### 7 commentairesAfficher 5 commentaires plus anciensMasquer 5 commentaires plus anciens
Voss le 15 Fév 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 le 16 Fév 2024
Good solution. Thank you!

Connectez-vous pour commenter.

### Plus de réponses (1)

Aquatris le 15 Fév 2024
Modifié(e) : Aquatris le 15 Fév 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 commentairesAfficher 2 commentaires plus anciensMasquer 2 commentaires plus anciens
Aquatris le 15 Fév 2024
Modifié(e) : Aquatris le 16 Fév 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 le 16 Fév 2024
Thank you! It really helps me!

Connectez-vous pour commenter.

### Catégories

En savoir plus sur Matrices and Arrays dans Help Center et File Exchange

R2017b

### Community Treasure Hunt

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

Start Hunting!

Translated by