1

MATLAB では:

n = histc(x,edges);

次のように動作するように定義されています。

n(k) は、edges(k) <= x(i) <edges(k+1) の場合、値 x(i) をカウントします。最後のビンは、edges(end) に一致する x の値をカウントします。

n(1) が edge(1) に一致する x の値をカウントし、n(end) が edge(end-1) <= x を満たす値 x(i) をカウントするように、終了動作を反転する方法はありますか? (i) < エッジ (エンド)?

4

2 に答える 2

2

次のコードを検討してください。

n = histc(x, [edges(1) edges]);
n(1) = sum(x==edges(1));
n(end) = [];

投稿された質問によると、上記は次のように返されます。

  • n(1): 一致する x の値をカウントしますedges(1)
  • n(k) [k~=1]: 値 x(i) をカウントしますedges(k-1) <= x(i) < edges(k)

これは、彼の答えが境界を使用するという点で、 gnoviceソリューションとは異なります: edges(k-1) < x(i) <= edges(k)(等号の位置に注意してください)。


実証するために、次の簡単な例を検討してください。

x = [0 1 1.5 2 2.5 4 6.5 8 10];
edges = 0:2:10;

>> n = fliplr(histc(-x,-fliplr(edges)))
n =
     1     3     2     0     2     1

間隔に対応: 0 (0,2] (2,4] (4,6] (6,8] (8,10]

に対して:

>> n = histc(x, [edges(1) edges]);
>> n(1) = sum(x==edges(1));
>> n(end) = []
n =
     1     3     2     1     1     1

間隔に対応: 0 [0,2) [2,4) [4,6) [6,8) [8,10)

于 2009-10-13T02:24:05.223 に答える
0

引数は単調に減少しない値を持つ必要があるためedges、エッジの動作を反転する 1 つの方法は、edges引数を無効にして反転し、ビニングの値を無効にすることです。その後、 HISTCからのビン カウント出力を反転すると、 HISTCの典型的なエッジ動作が反転するはずです。

n = fliplr(histc(-x,-fliplr(edges)));

上記はFLIPLRを使用しているためxedgesと は行ベクトル (つまり、1 行 N 列) である必要があります。このコードは、次の基準に従ってデータをビン化します。

  • 最初のビンは、その matchn(1)のすべての値をカウントします。xedges(1)
  • 他のビンは、 のようなn(k)値をカウントします。x(i)edges(k-1) < x(i) <= edges(k)

これにより、最初と最後のビンだけでなく、すべてのビンのエッジ動作が反転することに注意してください。bin に対する HISTCの典型的なn(k)動作では、次の式が使用されますedges(k) <= x(i) < edges(k+1)(インデックスの違いと、どちらの側に等号があるかに注意してください!)。


編集:いくつかの議論の後...

代わりに、次の基準に従ってデータをビン化する場合:

  • 最初のビンは、その matchn(1)のすべての値をカウントします。xedges(1)
  • 2 番目のビンは、 のようなn(2)値をカウントします。x(i)edges(1) < x(i) < edges(2)
  • 他のビンは、 のようなn(k)値をカウントします。x(i)edges(k-1) <= x(i) < edges(k)

次に、次のようにしてこれを達成する必要があります。

n = histc(x,[edges(1) edges(1)+eps(edges(1)) edges(2:end)]);
n(end) = [];

最初のビンは に等しい値のみをキャプチャする必要がありedges(1)ますが、2 番目のビンの下端は( EPS関数edges(1)を使用して検出された) 上の増分値から開始する必要があります。に等しい値の数をカウントする最後のビンは破棄されます。edges(end)

于 2009-10-12T23:43:08.067 に答える