Removing repeated numbers in a matrix
Afficher commentaires plus anciens
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]
Réponse acceptée
Plus de réponses (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 commentaires
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
le 23 Août 2020
Modifié(e) : Bruno Luong
le 23 Août 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
le 23 Août 2020
You are absolutely right.
Catégories
En savoir plus sur Resizing and Reshaping Matrices dans Centre d'aide et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!