MatLab accumarray 意外更改排序 [英] MatLab accumarray unexpectedly changing ordering
问题描述
只要我理解 accumarray,它的意思就是制作输出的第 n 行:1)在 sub 中找到 n.2)如果 n 在 sub 中的 m1、m2、m3 元素中,3)将函数应用于m1,m2,m3 val 的第 4 个元素),即输出的第 n 行"
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"
我是不是哪里错了?
我运行了以下代码.
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
订阅 =
2
2
1
1
1
1
r2 =
[1x4 double]
[1x2 double]
ans =
12 11 14 10
ans =
13 10
==========================
=========================
但我预计 r{1} = 11 14 12 10
和 r{2} = 10 13
.
为什么 accumarray 突然改变了顺序?
Why did accumarray suddenly changed the ordering?
我怎样才能得到预期的结果?
How can I get the expected result?
推荐答案
注意如果subs
中的下标没有排序,fun
应该不依赖其输入数据中的值的顺序.
Note If the subscripts in
subs
are not sorted,fun
should not depend on the order of the values in its input data.
并且您的 subs
没有排序(至少不是升序).如果您重写代码以便对 subs
进行排序并且 vals
也相应地重新排列,您将获得所需的结果:
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}
运行此代码返回:
ans =
11 14 12 10
ans =
10 13
这篇关于MatLab accumarray 意外更改排序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!