MATLAB Answers

Naime
0

find array inside a cell

Asked by Naime
on 15 Jan 2019
Latest activity Edited by Stephen Cobeldick on 22 Jan 2019
I have a A={[1,2,4],[2,3,7],[2,5],[4,5,6]} and B=[1;2;3;6;8]
I want to write a code that find B inside A.
the result should be c={[1,2],[2,3],[2],[6]}.
I try this code
c=cell(1, size(A,2));
for i=1:size(A,2)
current=A{i};
for j=1:size(B,1)
index_X = find(A{i} == B(j));
if isempty(index_X)==0
c{i}(end+1)=B(index_X);
end
end
end
but it does not work

  0 Comments

Sign in to comment.

2 Answers

Answer by Stephen Cobeldick on 15 Jan 2019
Edited by Stephen Cobeldick on 15 Jan 2019
 Accepted Answer

Simpler in one line:
>> A = {[1,2,4],[2,3,7],[2,5],[4,5,6]};
>> B = [1;2;3;6;8];
>> C = cellfun(@(m)intersect(m,B),A,'uni',0);
>> celldisp(C)
C{1} =
1
2
C{2} =
2
3
C{3} =
2
C{4} =
6

  14 Comments

@Naime Ahmadi: you really are going to have to explain the logic of that. Given these inputs:
A = {[1,2,4],[2,3,7],[2,5],[4,5,6]};
B = [1,2;1,5;2,3;2,4;2,5;3,4;4,7];
"answer should be ={[1,2,5,7],[4,5,6],[3,4],[]} "
Lets compare the values in the first column of B against the first cell of A:
1 -> matches A{1}(1)
1 -> matches A{1}(1)
2 -> matches A{1}(2)
2 -> matches A{1}(2)
2 -> matches A{1}(2)
3 -> no match
4 -> matches A{1}(3)
So this would give matches for rows [1,2,3,4,5,7]. Where do you get [1,2,5,7] from?
And for the second cell of A:
1 -> no match
1 -> no match
2 -> matches A{2}(1)
2 -> matches A{2}(1)
2 -> matches A{2}(1)
3 -> matches A{2}(2)
4 -> no match
So this would give matches for rows [3,4,5,6]. Where do you get [4,5,6] from?
Please explain carefully. I cannot read your mind, only what you write.
Naime
on 22 Jan 2019
first column of B against the first cell of A:
A=[1,2,4]
B=[1,2;1,5;2,3;2,4;2,5;3,4;4,7]
1,2 -> Not matches as both (1,2) is in A
1,5 -> matches A{1}(1) (first column is in A but second column is not in A)
2,3 -> matches A{1}(2) (first column is in A but second column is not in A)
2,4-> Not matches A{1}(2) as both (2,4) is in A
2,5-> matches A{1}(2) (first column is in A but second column is not in A)
3,4-> no match (4 is in A but as it is in second column of B it is not match)
4,7 -> matches A{1}(3) (first column is in A but second column is not in A)
@Naime Ahmadi: in your earlier comment you wrote "answer should be={[1,2,5,7],[4,5,6],[3,4],[]} "
Now you seem to indicate that it should be [2,3,5,7] for the first cell. Which is correct?
Perhaps this does what you want:
>> A = {[1,2,4],[2,3,7],[2,5],[4,5,6]};
>> B = [1,2;1,5;2,3;2,4;2,5;3,4;4,7];
>> F = @(v)find(any(v==B(:,1),2)&~any(v==B(:,2),2));
>> C = cellfun(F,A,'uni',0)
>> C{:}
ans =
2
3
5
7
ans =
4
5
6
ans =
3
4
ans =
7

Sign in to comment.


madhan ravi
Answer by madhan ravi
on 15 Jan 2019
Edited by madhan ravi
on 15 Jan 2019

A={[1,2,4],[2,3,7],[2,5],[4,5,6]} ;
B=[1;2;3;6;8];
Result=cell(1,numel(A)); % preallocate
for i = 1:numel(A)
idx=ismember(A{i},B);
Result{i}=A{i}(idx);
end
celldisp(Result)
Gives:
Result{1} =
1 2
Result{2} =
2 3
Result{3} =
2
Result{4} =
6

  0 Comments

Sign in to comment.