在MATLAB中矢量化代码(避免循环)

时间:2016-05-23 08:43:25

标签: arrays matlab indexing

我有4个阵列:

k      = [5    0    1    2    3    3    4   ] %// array of indexes
logind = [1    0    0    0    0    0    1   ] %// logical array of indexes's activity
mass   = [100  200  300  400  500  600  700 ] %// array of masses
res  %//some data matrix

我想实现以下算法:

  1. 找到logind的非零索引。就我的例子而言:c = [1 7]
  2. 获取kmass的相应值。 k([1 7]) = [5 4]mass = [100 700]
  3. 并最终实现以下目标:
  4. logind(1)==1 - > k(1)==5所以

    res(5,1) = res(5,1) + mass(1);
    

    logind(7)==1 - > k(7)==4所以

    res(4,7) = res(4,7) + mass(7);
    

    我知道我可以使用for循环来做,但是我使用大型数组,所以想避免这种方法。

    我已经尝试过:

    arrayfun( @(x) res(k(x), x) + mass(x) )
    

    效果很好,但只返回这些总和,我不知道如何将它添加到当前数组。

1 个答案:

答案 0 :(得分:2)

试试这个:

x = k(logind)
y = find(logind)

res = zeros(max(k),numel(logind));

ind = sub2ind(size(res),x,y)

res(ind) = res(ind) + mass(x)

虽然logind指示要更改的元素列并且它永远不能包含相同的列,但我不明白为什么需要res(...) +部分?在这种情况下你可以去

res(ind) = mass(x)