【问题标题】:MatLab accumarray unexpectedly changing orderingMatLab accumarray 意外更改排序
【发布时间】:2013-07-20 09:18:04
【问题描述】:

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

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 突然改变了顺序?

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

【问题讨论】:

    标签: matlab grouping accumulate accumarray


    【解决方案1】:

    documentation of 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
    

    【讨论】:

    • 如果您有多列subs,则在linear indexing 意义上,排序意味着。详情见this question我最近问的。
    • @Mohsen_Nosratinia 谢谢!这行得通。一旦我达到足够的声誉,我会投票给你的答案。
    • @LuisMendo 你已经成为了请-接受-the-accepted-answer 的警察,我喜欢它!
    猜你喜欢
    • 2014-07-31
    • 2015-07-25
    • 2013-06-19
    • 1970-01-01
    • 2015-04-12
    • 2013-11-12
    • 2014-05-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多