MatLab AccumArray 意外改变顺序

use*_*133 2 matlab grouping accumulate accumarray

只要我理解accumarray,它的意思是“制作输出的第n行:1)在sub中找到n。2)如果n在sub中的m1,m2,m3个元素中,3)将函数应用于m1,m2 ,m3 val 4) 的第一个元素,这是输出的第 n 行”

我有什么地方说错了吗?

我运行了以下代码。

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}
Run Code Online (Sandbox Code Playgroud)

A=

 2    10    13
 1    11    14
 1    12    10
Run Code Online (Sandbox Code Playgroud)

U=

 1
 2
Run Code Online (Sandbox Code Playgroud)

九 =

 3
 1
Run Code Online (Sandbox Code Playgroud)

国际单位 =

 2
 1
 1
Run Code Online (Sandbox Code Playgroud)

值=

10
13
11
14
12
10
Run Code Online (Sandbox Code Playgroud)

替补=

 2
 2
 1
 1
 1
 1
Run Code Online (Sandbox Code Playgroud)

r2 =

[1x4 double]
[1x2 double]
Run Code Online (Sandbox Code Playgroud)

答案=

12    11    14    10
Run Code Online (Sandbox Code Playgroud)

答案=

13    10
Run Code Online (Sandbox Code Playgroud)

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

但我预料到了r{1} = 11 14 12 10,并且r{2} = 10 13

为什么accumarray突然改变了顺序?

我怎样才能得到预期的结果?

Moh*_*nia 5

Accumarray 的文档说:

注意: 如果 中的下标subs未排序,fun则不应依赖于其输入数据中值的顺序。

并且您的subs未排序(至少不是按升序排列)。如果您重写代码以便对其subs进行排序并vals相应地重新排列,您将获得所需的结果:

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}
Run Code Online (Sandbox Code Playgroud)

运行此代码将返回:

ans =
    11    14    12    10
ans =
    10    13
Run Code Online (Sandbox Code Playgroud)

  • 如果您有多列“子”,则排序意味着[线性索引](http://www.mathworks.com/help/matlab/math/matrix-indexing.html#f1-85511)。有关详细信息,请参阅我最近问的[这个问题](http://stackoverflow.com/questions/17536558/)。 (3认同)
  • @LuisMendo 你已经成为请_接受_接受答案的警察,我喜欢它! (2认同)