2

只要我理解accumarray,它的意思是“制作输出的第n行:1)在sub中找到n。2)如果n在sub中的m1,m2,m3第3个元素中,3)将函数应用于m1,m2 , val 4) 的第 m3 个元素,即输出的第 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}

一个=

 2    10    13
 1    11    14
 1    12    10

U =

 1
 2

九 =

 3
 1

iu =

 2
 1
 1

值 =

10
13
11
14
12
10

潜艇=

 2
 2
 1
 1
 1
 1

r2 =

[1x4 double]
[1x2 double]

答案=

12    11    14    10

答案=

13    10

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

但我预计r{1} = 11 14 12 10,和r{2} = 10 13

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

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

4

1 回答 1

4

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}

运行此代码返回:

ans =
    11    14    12    10
ans =
    10    13
于 2013-07-21T17:50:30.760 回答