MATLAB内置函数accumarray
接受一个函数fun
作为第四个参数。
A = accumarray(subs,val,sz,fun);
这将fun
应用于val
中具有相同下标的subs
元素子集。然而文档说明如下:
如果
subs
中的下标与其线性指数无序,则fun
不应依赖其输入数据中值的顺序。
我们如何实现一个稳定的accumarray
版本,它没有这个限制,但保证子集采用由val
给出的相同顺序?
示例:
subs = [1:10,1:10];
val = 1:20;
accumarray(subs(:), val(:), [], @(x)x(end)).'
如果
accumarray
稳定,预期输出为11:20
。实际输出是:ans =
11 12 13 14 5 6 7 18 19 20
我们的实现应该产生:
accumarrayStable(subs(:), val(:), [], @(x)x(end)).'`
ans =
11 12 13 14 15 16 17 18 19 20
sortrows
中是必要的,这样排序才能按线性索引的方式进行,对吧?也许你可以在你的回答中加上这一点。 - Luis Mendomax
找出矩阵的维度,我觉得这会增加不必要的复杂性。我会尝试一下。 - knedlseppfun = @(x)x(end)
有关,由于某种原因,它比版本1慢得多... 我们应该使用一个测试用例,其中fun~=sum
,否则稳定的东西根本没有任何意义。 - knedlseppsum
的评论是错的 :-) 所以我们认为稳定性对于“非标准”函数是有意义的。 - Luis Mendo