Keep only elements that appear multiple times
11 vues (au cours des 30 derniers jours)
Afficher commentaires plus anciens
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!
0 commentaires
Réponse acceptée
Roger Stafford
le 13 Juin 2013
Actually I didn't need to find the inverse of permutation p. The following is one step shorter:
[B,p] = sort(A(:));
t = [true;diff(B)~=0;true];
q = cumsum(t(1:end-1));
t = diff(find(t))<3;
A(p(t(q))) = 0;
2 commentaires
Roger Stafford
le 15 Juin 2013
In the previous version I first took the inverse of p with the line
p(p) = 1:length(p);
and subsequently did this
A(t(q(p))) = 0;
It only occurred to me later that the inverse operation is not needed if we do the last step this way:
A(p(t(q))) = 0;
Without that inverse operation this last order p(t(q)) is essential. It wouldn't work otherwise.
Plus de réponses (4)
Roger Stafford
le 12 Juin 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;
0 commentaires
Roger Stafford
le 13 Juin 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;
0 commentaires
Azzi Abdelmalek
le 12 Juin 2013
Modifié(e) : Azzi Abdelmalek
le 12 Juin 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
0 commentaires
Voir également
Catégories
En savoir plus sur Logical dans Help Center et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!