我想在矩阵中累积索引元素,比如R中的table和tapply函数。
我发现稀疏(i,j,s,m,n)完全符合我的需要,
正如文件所说:“任何具有i和j重复值的s元素都会加在一起。”
但我必须使用full():
将获得的稀疏矩阵转换为完整矩阵a = a + full(sparse(i,j,s,m,n));
这是一种有效的方法吗?
顺便说一下,无论是否添加重复的i,j对,有什么类似下面的内容吗?
a = setelements(a, i,j,s);
和
vector = getelement(a,i,j);
其中i& j在稀疏()函数中有意义。
如果a是多维数组怎么办? sparse()只处理矩阵。 我是否必须使用外部循环逐页设置条目?
答案 0 :(得分:2)
看看accumaray
。例如,
ii = [1 2 2 3 3];
jj = [3 2 2 2 2];
s = [10 20 30 40 50];
a = accumarray([ii(:) jj(:)],s(:));
给出
a =
0 0 10
0 50 0
0 90 0
请注意,第一个参数([ii(:) jj(:)]
)的每一行都定义了输出数组的N维索引(在本例中N为2)。
accumarray
非常灵活。它适用于N维数组,允许您指定结果的大小(它可能大于从提供的索引推断的),甚至可以将任意函数(不同于sum)应用于由同一索引定义的每组值
作为一个更一般的例子,使用上述数据,
a = accumarray([ii(:) jj(:)],s(:),[4 4],@max)
给出
a =
0 0 10 0
0 30 0 0
0 50 0 0
0 0 0 0