我需要了解 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 函数。
看起来这个输入值排序是其他输出值与您的期望不同的原因。