使用Matlab进行矢量化编程

时间:2016-02-16 10:43:32

标签: matlab vectorization

我有一个向量J,它包含向量的行索引。 我想以矢量化方式执行以下代码:我想将重复值与变量“M”中的变量“Mode”相加。我有size(M)=size(J)。这是我尝试过的代码:

Mode=zeros(n,1);
for i=1:length(J)
    Mode(J(i))=Mode(J(i))+M(i);
end

我已经测试了

Mode(J)=M

但问题是J中有一些重复的索引值。 我该如何正确实施?

1 个答案:

答案 0 :(得分:3)

您可能正在寻找accumarray

看一下这个例子:

tempfile.TemporaryFile([mode='w+b'[, bufsize=-1[, suffix=''[, prefix='tmp'[, dir=None]]]]])

来自文档:

  

J = [1 2 3 5 2 3].'; M = [1 1 1 1 1 1].'; Mode = accumarray(J, M, size(J)) Mode = 1 2 2 0 1 0 通过使用下标A = accumarray(subs,val)累积向量A的元素来返回数组val。如果subs是列向量,则每个元素在输出中定义相应的下标,该下标也是列向量。 subs函数收集accumarray中具有相同下标的val的所有元素,并将其总和存储在与该下标对应的subs 的位置(A。其for index i, A(i)=sum(val(subs(:)==i)))下标A的元素等于subs

0用于确保size(J)的维度与Mode的维度相同。

根据OP,以下代码有效:

J