2017-03-15 9 views
1

私は行列distance = [d11,d12,d13,d14;d15;...;dn1,dn2,dn3,dn4,dn5];とベクトルindex(n,1)を持っています。インデックスの値は1から5の間です。ループなしのMatlab演算

ベクトルR(1,5)の場合、インデックスにしたがって距離の合計を求めます。

例:場合は、実行の時間を最小限にするために、もし条件で5:

distance = [1,2,4,1,2 ; 4,5,6,1,6 ; 7,8,9,5,8] and index = [1;1;3]

だから、私が欲しいR(1) = 1+4 = 5, R(2) = 0, R(3) = 9, and R(4) = R(5) = 0

条件は1をループを使用しないことです数十億のポイントがあります。

arrayfunで可能かもしれませんが、成功しません。そうでない場合は

値が関連している場合は、 1を含むマトリックスを作成するために bsxfunを使用することができます

敬具

答えて

1

あなたは合計する持っている要素を見つけるために、そして0。これは、ベクトル[1, 2, 3, 4, 5]を作成し、indexとそのベクトル間の要素ごとの比較を行います

bsxfun(@eq, index, 1:5) 

で行うことができます。この関数の結果は、今、あなたはdistance行列(!要素単位)で、この行列を乗算し、最終的に各列の上に合計することができ

ans = 

    1  0  0  0  0 
    1  0  0  0  0 
    0  0  1  0  0 

です:

R = 

    5  0  9  0  0 
になり
>> R = sum(bsxfun(@eq, index, 1:5) .* distance, 1); 

+0

ありがとうございます。 今、私はRの各値を正規化したいと思います。 ループなしで作業するのが難しいです... – gpbdr13

+0

'R'の長さを1にすると、' R(1)= 5/14'と 'R(3)= 9/14'で正規化しますか?あなたの例? – hbaderts

+0

私は解を見つける: A = bsxfun(@ eq、index、1:5) R =合計(bsxfun(@eq、index、1:5)。*距離、1)./合計(A 1:5)); – gpbdr13