了解Matlab中的accumarray函数

4

我需要理解accumarray以便编写我所需的代码。

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

大多数示例都很清晰。

然而,在第二个示例的第一个示例中,我认为B的(1,2)元素应该是1,因为

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

此外,在Example 2的第二个例子中,我认为B1的(1,2)元素应该是2而不是-2,因为:
(1,2) = 1st, 3rd of subs
1st, 3rd of vals = 101, 103
sum(diff([101,103]))=2

我认为

B1的第四行第一列元素应该是1而不是-1

因为

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

我错过了什么?

请纠正,我需要深入理解accumarray以编写自己的代码。

2个回答

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

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

看起来这个输入值的排序是其他输出值与您期望不同的原因。


刚注意到您之前已经问过一个非常类似的问题。http://stackoverflow.com/questions/17774015/matlab-accumarray-unexpectedly-changing-ordering - grantnz
谢谢。但是我怎样才能知道 MatLab 是否会传递 [102 101] 或 [101 102]?如果我不知道这个,那显然我无法以系统化的方式编码。 - user1849133
chappjc展示了如何对子项进行排序,并将此排序顺序应用于值,以获得您想要的答案。 - grantnz

1

原因已经在grantnz的回答中说明了,以下是如何获得可预测的行为。

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

这意味着 对于表示矩阵中(行,列)位置的下标,指向的元素必须按照线性索引排序。因此,要“排序”2D子脚本,需要对等效的线性索引进行排序。然后需要将该顺序应用于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

至少可以看出来文档中的这个注释是在说这个。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接