MatLab accumarray 意外更改排序 [英] MatLab accumarray unexpectedly changing ordering

查看:19
本文介绍了MatLab accumarray 意外更改排序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

只要我理解 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 10r{2} = 10 13.

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

Why did accumarray suddenly changed the ordering?

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

How can I get the expected result?

推荐答案

文档accumarray 的 说:

注意如果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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆