Keep only elements that appear multiple times
Mostrar comentarios más antiguos
Hey everyone, been banging my head against this for awhile and can't come up with something efficient.
I have a large matrix, roughly 1000x1000, and I want to discard all elements (or replace with 0) that don't appear in the matrix at least three times. Additionally, I'm trying to allow for an error range so that, say, 10.1 and 9.9 (some arbitrary interval) will count as "10" (but this is secondary to the original problem).
I'm guessing that my main issue is that rewriting/editing a matrix is computationally expensive. The only solution I came up with involved numel in a loop, which is dreadfully slow.
Thanks for looking, advice is appreciated!
Respuesta aceptada
Más respuestas (4)
Roger Stafford
el 12 de Jun. de 2013
Here's a modification of Azzi's code that avoids the 'ismember' call.
[B,~,p] = unique(A(:));
t = histc(A(:),B)<3;
A(t(p)) = 0;
Roger Stafford
el 13 de Jun. de 2013
This version uses the 'sort' function instead of 'unique' and 'histc'. Consequently it might be faster.
[B,p] = sort(A(:));
p(p) = 1:length(p);
t = [true;diff(B)~=0;true];
q = cumsum(t);
t = diff(find(t))<3;
A(t(q(p))) = 0;
Andrei Bobrov
el 13 de Jun. de 2013
[a,b] = histc(A(:),unique(A));
A(a(b) < 3) = 0;
Azzi Abdelmalek
el 12 de Jun. de 2013
Editada: Azzi Abdelmalek
el 12 de Jun. de 2013
A=[1 2 1 1;1 2 3 1;3 3 3 3;3 0 0 1];
B=unique(A(:));
A(ismember(A(:),B(histc(A(:),B)<3)))=0
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!