如何在matlab中优雅地求和为向量的重复索引
我正试图找到一种不进行循环的方法来执行以下操作: 假设我有一个向量如何在matlab中优雅地求和为向量的重复索引,matlab,vectorization,Matlab,Vectorization,我正试图找到一种不进行循环的方法来执行以下操作: 假设我有一个向量x,其中我将一些元素e相加。我还有一个索引向量id,它表示要将值发送到x的哪些元素。i、 e x = zeros(1,4); e = [ 1 10 100 1e3 1e4]; ids = [1 1 2 4 3]; 我想做一些像 x(ids) = x(ids) + e 那会回来的 x = 11 100 10000 1000 因为我们引用x(1)两次,而它返回 x
x
,其中我将一些元素e
相加。我还有一个索引向量id
,它表示要将值发送到x
的哪些元素。i、 e
x = zeros(1,4);
e = [ 1 10 100 1e3 1e4];
ids = [1 1 2 4 3];
我想做一些像
x(ids) = x(ids) + e
那会回来的
x =
11 100 10000 1000
因为我们引用x(1)两次,而它返回
x =
10 100 10000 1000
accumaray
是一个非常有用的函数,可以实现这些技巧。就你而言:
accumarray(ids',e)
将完成这项工作。
accumaray
是一个非常有用的函数,用于执行此类技巧。就你而言:
accumarray(ids',e)
将完成这项工作。使用
accumarray
:accumarray(ids,e)
。使用accumarray
:accumarray(ids,e)
。就像中提到的@Divakar。转置是怎么回事?没有必要这样做。@Adriaan我认为当它是行向量时,ids
需要这样做。因此,为了使其通用,使其能够与任何向量一起工作,可以执行accumarray(id(:),e)
。e
上的转置不需要,尽管.OP将ID作为行向量,accumarray将其解释为5维向量的一个索引。不需要换位e,这是我的错误。就像中提到的@Divakar。转置是怎么回事?没有必要这样做。@Adriaan我认为当它是行向量时,ids
需要这样做。因此,为了使其通用,使其能够与任何向量一起工作,可以执行accumarray(id(:),e)
。e
上的转置不需要,尽管.OP将ID作为行向量,accumarray将其解释为5维向量的一个索引。不需要转换e,那是我的错误。