2017-07-23 5 views
3

J'ai une matrice à deux colonnes. Je dois faire trois colonne, où la troisième colonne montre le nombre d'apparition des deux premiers comme une rangée dans la matrice d'entrée.Comptage des mêmes rangées de matrice 2D

En gros: Entrée

[1 1; 
1 1; 
1 2; 
1 2; 
1 3] 

de sortie souhaitée:

[1 1 2; 
1 2 2; 
1 3 1] 

Je sais déjà qu'une combinaison appropriée de accumArray et unique devraient faire le charme. Je ne sais pas comment les combiner correctement.

Répondre

3

Vous avez raison, unique et accumarray sont parfaitement adaptés à cette tâche:

x = [1 1; 1 1; 1 2; 1 2; 1 3]; % input 
[~, v, w] = unique(x, 'rows', 'stable'); % unique indices and labels 
c = accumarray(w, 1); % counts 
y = [x(v,:) c]; % output 

Retirez le drapeau 'stable' si vous voulez que les lignes ouput triées dans l'ordre lexicographique.

Vous pouvez également remplacer accumarray par bsxfun pour obtenir les comptes:

c = sum(bsxfun(@eq, unique(w), w.'), 2); 

Pour le cas particulier que les entrées de x sont des nombres entiers positifs et que vous voulez le ouput pour lexicographique, vous pouvez aussi utiliser sparse et find comme suit:

x = [1 1; 1 1; 1 2; 1 2; 1 3]; % input 
[ii,jj,vv] = find(sparse(x(:,1), x(:,2), 1)); 
y = [ii(:), jj(:), vv(:)]; % output 
3

Une solution possible:

clear 
a=... 
[1 1; 
1 1; 
1 2; 
1 2; 
1 3] 

[U,~,ic]=unique(a,'rows'); 
[C] = histc(ic,unique(ic)); 
Result=[U,C] 
+0

Dommage que 'histc' soit en train d'être déprécié. Avec le nouveau 'hitstcounts', vous devrez ajouter' inf' et transposer pour obtenir le même résultat: 'C = histcounts (ic, [unique (ic); inf]). '' –