2016-03-23 11 views
0

対応するビンを数えるために、異なるタイムスタンプでベクトルを整列してカウントしたいと思います。matlabでベクトルを非同期タイムスタンプに揃える方法は?

次の構造の[N、edges] = histcountsから3つの行列があるとしましょう。最初の行はエッジを表しているので、ビンが表示されます。 2番目の行は値を表します。すべての値を同じビンで合計したいと思います。

A = [0 1 2 3 4 5; 
    5 5 6 7 8 5] 

B = [1 2 3 4 5 6; 
    2 5 7 8 5 4] 

C = [2 3 4 5 6 7 8; 
    1 2 6 7 4 3 2] 

今、私はすべて同じビンを合計したいと思います。私の最終的な結果は次のようになります。

result = [0 1 2 3 4 5 6 7 8; 
      5 7 12 16 ...] 

私はすべての数字の上にループをできたが、私はそれが速く持っているしたいと思います。

答えて

4

あなたはaccumarrayを使用することができます。

H = [A B C].'; %//' Concatenate the histograms and make them column vectors 

V = [unique(H(:,1)) accumarray(H(:,1)+1, H(:,2))].'; %//' Find unique values and accumulate 

V = 

    0 1 2 3 4 5 6 7 8 
    5 7 12 16 22 17 8 3 2 

注:H(:,1)+1が陽性とビン値を強制することです、そうでない場合、MATLABは文句を言うでしょう。出力Vの実際のビンは引き続き使用します。 (:https://stackoverflow.com/a/27783568/2732801を参照してください):@Danielコメントで述べているように、これを避けるthird output of uniqueを使用するには

H = [A B C].'; %//' stupid syntax highlighting :/ 
[U, ~, IU] = unique(H(:,1)); 
V = [U accumarray(IU, H(:,2))].'; 
+2

+1を避けるには、[uniqueの3番目の出力を使用する](http://stackoverflow.com/a/27783568/2732801)。その後、最初の行は何でもかまいません(負の値または浮動小数点を含む) – Daniel

+0

@Danielそれは良い、ありがとうございます。 – beaker

2

あなたが示してきたように3つの変数だけを使っているのであれば、それをループすることでパフォーマンスヒットは起こりそうにないでしょう。

しかし、あなたがループのアイデアを本当に嫌うなら、arrayfunを使ってそれを行うことができます。

rng = 0:8; 
output = arrayfun(@(x)sum([A(2,A(1,:) == x), B(2,B(1,:) == x), C(2,C(1,:) == x)]), rng); 

output = cat(1, rng, output); 

    output = 

     0  1  2  3  4  5  6  7  8 
     5  7 12 16 22 17  8  3  2 

データのないコピーが存在しないので、これは特に大きなAB、及びC変数に有益であり得ます。

+0

は答えをいただき、ありがとうございます。ビーカーとダニエルの答えはより一般的なので、私は彼に "同意"を与えました。 –

関連する問題