2013-07-21 2 views
2

Tant que j'ai compris accumarray, cela signifie "Faire la nième ligne de la sortie: 1) trouver n dans le sous 2) si n est en m1, m2, m3 ème élément en sous, 3) appliquer la fonction à m1, m2, m3 e élément de val 4) qui est la nième ligne de la sortie "MatLab accumarray changeant de façon inattendue commande

Ai-je tort quelque part?

J'ai exécuté le code suivant.

A = [2 10 13 ; 1 11 14; 1 12 10] 
[U,ix,iu]= unique(A(:,1)) 
vals = reshape(A(:, 2:end).', [], 1) 
subs = reshape(iu(:, ones(size(A, 2)-1,1)).', [], 1) 
r2 = accumarray(subs, vals', [], @(x){x'}) 
r2{1} 
r2{2} 

A =

2 10 13 
1 11 14 
1 12 10 

U =

1 
2 

ix =

3 
1 

iu =

2 
1 
1 

vals =

10 
13 
11 
14 
12 
10 

subs =

2 
2 
1 
1 
1 
1 

r2 =

[1x4 double] 
[1x2 double] 

ans =

12 11 14 10 

ans =

13 10 

=========================

Mais je me attendais r{1} = 11 14 12 10 et r{2} = 10 13.

Pourquoi accumarray a soudainement changé la commande?

Comment puis-je obtenir le résultat attendu?

Répondre

4

Le documentation of accumarray dit:

Remarque Si les indices en subs ne sont pas triés, fun ne devrait pas dépendre de l'ordre des valeurs dans ses données d'entrée.

Et votre subs n'est pas trié (du moins pas dans l'ordre croissant). Si vous réécrivez le code afin que subs est triée et vals est également replacées vous obtenez le résultat souhaité:

A = [2 10 13 ; 1 11 14; 1 12 10] 
[U,ix,iu]= unique(A(:,1)) 
vals = reshape(A(:, 2:end).', [], 1) 
subs = reshape(iu(:, ones(size(A, 2)-1,1)).', [], 1) 
[subs_sorted, I] = sort(subs); 
r2 = accumarray(subs_sorted, vals(I)', [], @(x){x'}) 
r2{1} 
r2{2} 

Et l'exécution de ce code retourne:

ans = 
    11 14 12 10 
ans = 
    10 13 
+3

Où sorted on entend dans la [indexation linéaire ] (http://www.mathworks.com/help/matlab/math/matrix-indexing.html # f1-85511) détecter si vous avez plusieurs sous-colonnes. Pour plus de détails voir [cette question] (http://stackoverflow.com/questions/17536558/) J'ai récemment demandé. – Oleg

+0

@Mohsen_Nosratinia Merci! Cela marche. Je voterai pour votre réponse une fois que j'aurai atteint une réputation suffisante. – user1849133

+2

@ user2604484 Ce que vous devez faire est de _accepter_ la réponse –

Questions connexes