Removing repeated numbers in a matrix
Mostrar comentarios más antiguos
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]
Respuesta aceptada
Más respuestas (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 comentarios
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
el 23 de Ag. de 2020
Editada: Bruno Luong
el 23 de Ag. de 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
el 23 de Ag. de 2020
You are absolutely right.
Categorías
Más información sobre Logical en Centro de ayuda y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!