MATLAB Answers

Remove array values with multiple occurances from "parent" array

24 views (last 30 days)
Joe I
Joe I on 9 Jul 2020 at 17:29
Edited: Bruno Luong on 10 Jul 2020 at 13:42
How do you remove values in an array from a "master database" array? For example:
a = [1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4]
b = [1, 1, 2, 4, 4, 4]
I would like to remove each occurance of each value in 'b' from 'a' to get:
c = 1, 2, 2, 3, 3, 3
setdiff(a, b) doesn't work because it removes all instances from 'a' including the repeating values (it even says no repetitions in the documentation):
c = 3
[~, col] = ismember(b, a)
a(col) = []
doesn't work because it only removes one instance of the numbers (the first index where it occured):
c = 1, 1, 2, 2, 3, 3, 3, 4, 4
Thanks for the help.

  0 Comments

Sign in to comment.

Accepted Answer

David Hill
David Hill on 9 Jul 2020 at 19:09
Edited: David Hill on 9 Jul 2020 at 19:10
a = [1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4];
b = [1, 1, 2, 4, 4, 4];
c = a;
for i=b
c(find(c==i,1))=[];
end

  1 Comment

Joe I
Joe I on 9 Jul 2020 at 21:07
Awesome, thanks! Works great, scales up to my datasets with tens of thousands of values in each. Seems so obvious now after seeing it. Just be sure that each variable is a row vector.

Sign in to comment.

More Answers (1)

Bruno Luong
Bruno Luong on 10 Jul 2020 at 10:15
Edited: Bruno Luong on 10 Jul 2020 at 13:42
Test samples
a = [1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4]
b = [1, 1, 2, 4, 4, 4]
Code
u = unique([a,b]);
n = length(u);
[~, ia] = ismember(a,u); na = accumarray(ia(:),1,[n 1]);
[~, ib] = ismember(b,u); nb = accumarray(ib(:),1,[n 1]);
c = repelem(u,max(na-nb,0))
Result
c =
1 2 2 3 3 3

  0 Comments

Sign in to comment.