是否有完整数组的数组创建函数与稀疏矩阵构造函数具有相同的签名?

时间:2014-03-10 15:14:16

标签: matlab

我想在矩阵中累积索引元素,比如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()只处理矩阵。 我是否必须使用外部循环逐页设置条目?

1 个答案:

答案 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