2016-09-19 3 views
3

私は行列Aを持っています。最初の列に繰り返しのあるアイテムIDが含まれ、2番目の列に重みが含まれているとします。ループを使用せずにMATLAB内の2つのベクトルの要素を効率的に比較する方法はありますか?

A= [1 40 
    3 33 
    2 12 
    4 22 
    2 10 
    3 6 
    1 15 
    6 29 
    4 10 
    1 2 
    5 18 
    5 11 
    2 8 
    6 25 
    1 14 
    2 11 
    4 28 
    3 38 
    5 35 
    3 9]; 

私は今、各Aのインスタンスとそれに関連する最小重みの違いを見つけたいです。そのためには、最初の列にAの列1のユニークIDを持ち、列2にAの関連する最小の重みを含む列2を含む行列Bを作成します。

B=[1 2 
    2 8 
    3 6 
    4 10 
    5 11 
    6 25]; 

そして、IはAの列3の各エントリとそれに関連する最小の重量の差を保存します。

A= [1 40 38 
    3 33 27 
    2 12 4 
    4 22 12 
    2 10 2 
    3 6 0 
    1 15 13 
    6 29 4 
    4 10 0 
    1 2 0 
    5 18 7 
    5 11 0 
    2 8 0 
    6 25 0 
    1 14 12 
    2 11 3 
    4 28 18 
    3 38 32 
    5 35 24 
    3 9 3]; 

これは私がこれを行うために書いたコードです:

for i=1:size(A,1) 
    A(i,3) = A(i,1) - B(B(:,1)==A(i,2),2); 
end 

しかし、それはBをループすることがAをループするたびに必要として、このコードは実行に時間がかかります。つまり、それはsize(A) x size(B)の複雑さを持っています。ループを使用せずにこれを行うより良い方法はありますか?それはより速く実行されますか?

答えて

5

を使用して、Aの最初の列の一意の値ごとに、最初にAの2番目の列の最小値を計算することができます。 Aの最初の列を使用して結果に索引付けし、Aの2番目の列と比較して3番目の列を作成することができます。

% Compute the mins 
min_per_group = accumarray(A(:,1), A(:,2), [], @min); 

% Compute the difference between the second column and the minima 
A(:,3) = A(:,2) - min_per_group(A(:,1)); 
関連する問題