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突然改变了顺序?
我怎样才能得到预期的结果?
注意: 如果 中的下标
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)