How do I make cell filttering
조회 수: 2 (최근 30일)
이전 댓글 표시
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
Guillaume
2017년 1월 27일
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]?
채택된 답변
Guillaume
2017년 1월 27일
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
Jan
2017년 1월 27일
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 :-)
추가 답변 (2개)
Jan
2017년 1월 27일
편집: Jan
2017년 1월 27일
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
참고 항목
카테고리
Help Center 및 File Exchange에서 Operators and Elementary Operations에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!