2

As long as I understood accumarray, it means "Making the nth row of the output: 1) find n in sub. 2) if n is in m1, m2, m3 th element in sub, 3) apply the function to m1,m2,m3 th element of val 4) that's the nth row of the output"

Am I wrong somewhere?

I ran the following code.

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

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

But I expected r{1} = 11 14 12 10, and r{2} = 10 13.

Why did accumarray suddenly changed the ordering?

How can I get the expected result?

Stewie Griffin
  • 14,889
  • 11
  • 39
  • 70
user1849133
  • 527
  • 1
  • 7
  • 18

1 Answers1

5

The documentation of accumarray says:

Note If the subscripts in subs are not sorted, fun should not depend on the order of the values in its input data.

And your subs is not sorted (at least not in ascending order). If you rewrite the code so that subs is sorted and vals is also rearranged accordingly you get the desired result:

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}

And running this code returns:

ans =
    11    14    12    10
ans =
    10    13
Luis Mendo
  • 110,752
  • 13
  • 76
  • 147
Mohsen Nosratinia
  • 9,844
  • 1
  • 27
  • 52
  • 3
    Where sorted is meant in the [linear indexing](http://www.mathworks.com/help/matlab/math/matrix-indexing.html#f1-85511) sense if you have multiple-column `subs`. For details see [this question](http://stackoverflow.com/questions/17536558/) I recently asked. – Oleg Jul 21 '13 at 18:08
  • @Mohsen_Nosratinia Thank you! This works. I will vote for your answer once I reach enough reputation. – user1849133 Jul 22 '13 at 00:46
  • 2
    @LuisMendo You have become the please-_accept_-the-accepted-answer police, and I like it! – chappjc Nov 01 '13 at 17:54