【问题标题】:Understanding accumarray in Matlab了解 Matlab 中的 accumarray
【发布时间】:2013-11-12 08:28:04
【问题描述】:

我需要了解 accumarray 才能编写我真正需要的代码。

我试图理解http://www.mathworks.co.kr/kr/help/matlab/ref/accumarray.html

大多数例子都很清楚。

但是,在示例 2 的第一个示例中,我认为

B的第(1,2)个元素应该是1

因为

(1,2) = 1st, 2nd of subs
1st, 2nd of vals = 101, 102
sum(diff([101,102]))=1

另外,在示例 2 的第二个示例中,我认为

B1 的第 (1,2) 个元素应该是 2 而不是 -2

因为

(1,2) = 1st, 3rd of subs
1st, 3rd of vals = 101, 103
sum(diff([101,103]))=2

我也觉得

B1 的第 (4,1) 个元素应该是 1 而不是 -1

因为

(4,1) = 5,6th of subs
5,6th of vals = 105,106
sum(diff([105,106]))=1

我错过了什么?

请更正,我需要深入了解 accumarray 才能编写自己的代码。

【问题讨论】:

    标签: matlab accumarray


    【解决方案1】:

    为什么在grantnz 的回答中,这是获得可预测行为的方法。

    正如文档所说,“如果 subs 中的下标未排序,fun 不应依赖于其输入数据中值的顺序。”因此,要从 accumarray 中获得可预测的行为,必须对 subs 进行排序。

    这意味着对于表示矩阵中(行、列)位置的下标来说,下标所指向的元素必须根据线性索引进行排序。因此,要“排序”二维下标,您需要对等效的线性索引进行排序。然后你需要将该命令应用到vals,否则你已经打乱了你的数据。

    val = 101:106;
    subs = [1 2; 1 2; 3 1; 4 1; 4 4; 4 1];
    
    % convert the subscripts to linear inds and sort them
    inds = sub2ind([4 4],subs(:,1),subs(:,2));
    [indsSorted,sortingInds] = (sort(inds));
    
    % apply the sorting to val
    valsSorted = val(sortingInds);
    
    % convert inds back to subs
    [iiS jjS] = ind2sub([4 4],indsSorted);
    subsSorted = [iiS jjS];
    
    B = accumarray(subsSorted,valsSorted,[],@(x)sum(diff(x)))
    
    B =
    
         0     1     0     0
         0     0     0     0
         0     0     0     0
         2     0     0     0
    

    至少它会看到这是文档中的注释所说的内容。

    【讨论】:

      【解决方案2】:

      我认为意外的值是因为您期望这些值以与相关索引出现在 subs 中的相同顺序传递给匿名函数。

      但是,accumarray 的文档说:

      注意如果subs中的下标没有排序,fun不应该依赖 按照其输入数据中的值的顺序。

      这意味着 subs ( 1 2; 1 2; ) 的开始可能导致 102 101 或 101 102 被传递给匿名函数(因为文档说 fun 不应该依赖于值的顺序。

      sum(diff([102 101])) 为 -1,即示例中写入元素 1,2 的值

      val = 101:106;
      subs=[1 2; 1 2; 3 1; 4 1; 4 4; 4 1];
      B = accumarray(subs,val,[],@(x)sum(diff(x)))
      
      B =
      
           0    -1     0     0
           0     0     0     0
           0     0     0     0
           2     0     0     0
      

      当 diff 的结果显然取决于传递给它的值的顺序时,我不确定为什么 Mathworks 会选择在示例中使用 diff 函数。

      看起来这种输入值排序是导致其他输出值与您的预期不同的原因。

      【讨论】:

      • 刚刚注意到您之前问过一个非常相似的问题。 stackoverflow.com/questions/17774015/…
      • 谢谢。但是我怎么知道 MatLab 是否会通过 [102 101] 或 [101 102] ?如果我不知道这一点,那么显然我无法系统地编写代码。
      • chappjc 展示了如何对 subs 进行排序并将此排序顺序应用于 vals 以获得您想要的答案。
      猜你喜欢
      • 2015-04-12
      • 2015-07-25
      • 2013-06-19
      • 2011-12-20
      • 1970-01-01
      • 1970-01-01
      • 2014-05-12
      • 2019-09-15
      • 1970-01-01
      相关资源
      最近更新 更多