Removing repeated numbers in a matrix
Show older comments
Ex: In a matrix
A = [9 9 1 1 2 2 2 2 2 0 3 3; 7 7 4 4 4 5 5 6 6 6 6 6 ; 8 8 7 7 7 8 8 8 9 9 9 5]
, i want to eliminate all repeating elements and retain non-repeating elements
i.e. from the above example
A = [9 1 2 0 3 ; 7 4 5 6 ; 8 7 8 9 5]
To prevent a dimensions error because of different output results, the remaining entries on the left can be filled by zero like here
A = [9 1 2 0 3 ; 7 4 5 6 0 ; 8 7 8 9 5]
Accepted Answer
More Answers (1)
A = [9 9 1 1 2 2 2 2 2 0 3 3; 7 7 4 4 4 5 5 6 6 6 6 6 ; 8 8 7 7 7 8 8 8 9 9 9 5] ;
[m,n] = size(A) ;
C = cell(m,1) ;
for i = 1:m
C{i} = unique(A(i,:)) ;
end
L = cellfun(@length,C) ;
B = zeros(m,max(L)) ;
for i = 1:m
B(i,1:L(i)) = C{i} ;
end
4 Comments
Note that this returns the sorted unique elements in each row:
>> B
B =
0 1 2 3 9
4 5 6 7 0
5 7 8 9 0
which does not match what the question requested (compare against the example output).
Bruno Luong
on 23 Aug 2020
Edited: Bruno Luong
on 23 Aug 2020
Easy to fix with 'stable' option
A = [9 9 1 1 2 2 2 2 2 0 3 3;
7 7 4 4 4 5 5 6 6 6 6 6 ;
8 8 7 7 7 8 8 8 9 9 9 5]
c=arrayfun(@(r) unique(A(r,:),'stable'), 1:size(A,1), 'unif', 0);
n=max(cellfun(@length,c));
B=cell2mat(cellfun(@(x) [x,zeros(1,n-length(x))], c, 'unif', 0)')
"Easy to fix with 'stable' option"
Nope, not fixed. Lets try it:
>> c = arrayfun(@(r) unique(A(r,:),'stable'), 1:size(A,1), 'unif', 0);
>> n = max(cellfun(@length,c));
>> B = cell2mat(cellfun(@(x) [x,zeros(1,n-length(x))], c, 'unif', 0)')
B =
9 1 2 0 3
7 4 5 6 0
8 7 9 5 0
Note that the last row differs from the expected output given in the original question:
9 1 2 0 3
7 4 5 6 0
8 7 8 9 5
Bruno Luong
on 23 Aug 2020
You are absolutely right.
Categories
Find more on Logical in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!