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

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

大多数例子都很清楚。

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

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

因为

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

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

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

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

我还以为

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

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

我错过了什么?

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

最佳答案

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

但是, accumarray 的文档说:



这意味着 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 函数。

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

10-06 03:55