Unique and Length of every rows of a matrix
1 visualización (últimos 30 días)
Mostrar comentarios más antiguos
Hi,
The problem I want to solve is to "filter" the rows of a matrix n x 256. The filter criteria is to keep only the rows where the number of unique elements is between a certain range.
For example, if I have a range of 2:5, and a matrix of double similar to (i know it is not n x 256 for clarity) :
A = [ [1,1,1,4,5,3,3,5,6,1], [2,4,1,5,6,6,6,8,3,2] ... ];
I want to apply unique to every rows of A:
B = [ [1,4,5,3,6], [2,4,1,5,6,7,3] ... ];
Then I want to get the length of every rows of B:
C = [5,7,...];
Then I would like to keep only the rows of A where the corresponding C is in the range. Only the values of C inside the specified range should be kept (ie: 2:5) :
D = [5,...];
I think I could use the indexes of the C matrix that satisfies the criteria to filter A, but I do not know how...
Finally, A would look like :
A = [ [1,1,1,4,5,3,3,5,6,1], ... ];
What would be the quickest way to achieve this? Thank you for your inputs!
J-P
3 comentarios
Respuesta aceptada
Oleg Komarov
el 23 de Jul. de 2011
A = randi([1 256],100,256);
szA = size(A);
B = cell(szA(1),1);
for n = 1:szA(1)
B{n} = unique(A(n,:));
end
C = cellfun('length',B);
idx = ismember(C,100:150); % range 100:150
D = A(idx,:);
2 comentarios
Oleg Komarov
el 23 de Jul. de 2011
You could also skip the B{n} and do directly C(n) = numel(unique(A(n,:)) inside the loop, C should be preallocated before as C = zeros(szA(1),1);
Más respuestas (0)
Ver también
Categorías
Más información sobre Creating and Concatenating Matrices en Help Center y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!