intersection of multiple arrays
Show older comments
I have multiple 1D arrays with integers. Eg. A=[1,2,3,4] B=[1,4,5,6,7] C=[1,5,8,9,10,11]. Here 1 is repeated in all the arrays and 4 in A&B, 5 in B&C. I want these repeated values to be assigned to a single array, based on the size of the array, and removed from other arrays. How can I achieve this. Please help. TIA.
5 Comments
KSSV
on 14 Sep 2017
YOu want to remove 1, 5 and 4 from all the sets?
KL
on 14 Sep 2017
What do you mean by "based on the size of the array"?
Ananya Malik
on 14 Sep 2017
KL
on 14 Sep 2017
So you only wanto to remove 1 from all the matrices in the above example?
Ananya Malik
on 14 Sep 2017
Edited: Ananya Malik
on 14 Sep 2017
Accepted Answer
More Answers (2)
KL
on 14 Sep 2017
A=[1,2,3,4];
B=[1,4,5,6,7];
C=[1,5,8,9,10,11];
M = {A,B,C};
N = {[B C], [A C], [A B]};
CommonElements = unique(cell2mat(cellfun(@intersect, M,N,'UniformOutput',false)));
NewM = cellfun(@(x) removeEl(x,CommonElements),M,'UniformOutput',false);
%and then
function x = removeEl(x,a)
for el=1:length(a)
x(x==a(el))=[];
end
end
Guillaume
on 14 Sep 2017
This is how I'd do it:
C = {[1 2 3 4], [1 4 5 6 7], [1 5 8 9 10 11]};
%sort cell array by increasing vector size:
[~, order] = sort(cellfun(@numel, C));
C = C(order);
%get all unique values
uvals = unique(cell2mat(C));
%go through all arrays, keeping all values in uvals, then removing them from uvals so they can't be used by the next array
for iarr = 1:numel(C)
C{iarr} = intersect(C{iarr}, uvals); %only keep the values in uvals
uvals = setdiff(uvals, C{iarr}); %and remove the one we've just used
end
celldisp(C)
1 Comment
Ananya Malik
on 14 Sep 2017
Edited: Ananya Malik
on 14 Sep 2017
Categories
Find more on Logical in Help Center and File Exchange
Products
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!