How do I make cell filttering
1 vue (au cours des 30 derniers jours)
Afficher commentaires plus anciens
Dear all, I facing problem with cell array. For example; I have cell
a= { [1 2 3 4] [7 4] [ 3 5] [ 3 6 7 4]}
How I know each array repeat it number 4 in it and take first element in array?
Results1= {[1 2 3 4] [7 4] [ 3 6 7 4]};
Results2= [ 1 7 3];
Thanks…
3 commentaires
Guillaume
le 27 Jan 2017
Please don't add comments as Answers.
I don't fully understand your question. Why is [3 5] removed for Results1 and why is Results2 not [1 7 3 3]?
Réponse acceptée
Guillaume
le 27 Jan 2017
At a guess, you want all the arrays that contain the number 4:
a = {[1 2 3 4] [7 4] [ 3 5] [ 3 6 7 4]}
Results1 = a(cellfun(@(v) ismember(4, v), a))
And the first value of each element of Results1:
Results2 = cellfun(@(v) v(1), Results1)
If cellfun is too complex for you, the same with a loop:
a = {[1 2 3 4] [7 4] [ 3 5] [ 3 6 7 4]}
contains4 = false(size(a));
firstelement = zeros(size(a));
for idx = 1:numel(a)
contains4(idx) = ismember(4, a{idx});
firstelement(idx) = a{idx}(1);
end
Results1 = a(contains4)
Results2 = firstelement(contains4)
1 commentaire
Jan
le 27 Jan 2017
Funny. I've posted nearly the same code in the opposite order. Well, I will vote for your code, because I'm convinced it is efficient :-)
Plus de réponses (2)
Jan
le 27 Jan 2017
Modifié(e) : Jan
le 27 Jan 2017
A bold guess: Get all arrays, which contain the value 4 and copy their first element:
a = {[1 2 3 4], [7 4], [3 5], [3 6 7 4]};
n = numel(a);
found = false(1, n);
Result2 = zeros(1, n); % Pre-allocate
iResult = 0;
for k = 1:n
if any(a{k} == 4)
found(k) = true;
Result2(k) = a{k}(1);
end
end
Result1 = a(found);
Result2 = Result2(1:nnz(found));
If this does what you need, here a compact version:
Result1 = a(cellfun(@(x) any(x==4), a));
Result2 = cellfun(@(x) x(1), Result1);
0 commentaires
Voir également
Catégories
En savoir plus sur Operators and Elementary Operations dans Help Center et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!