4

我需要了解 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) 个元素应该是 1 而不是 -1

因为

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

我错过了什么?

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

4

2 回答 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

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

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

于 2013-11-01T07:11:25.190 回答
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

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

于 2013-11-01T17:50:23.163 回答