0

等しい長さの配列のペアが与えられます。.

void someFunc (const float **inputChannelData)
{
    const float* L = inputChannelData[0];
    const float* R = inputChannelData[1];
    ...

を使用して定数値の出現回数を数えるのは非常に簡単であることがわかりますstd::count 。.

std::count(L, L+someIntegerOffset, 0.0f)

...しかし、2つの配列内の同一の値の要素ごとの(各配列の同じインデックス)数をカウントする標準アルゴリズム(またはイディオム)はありますか?

Matlab に相当するものは次のようになりますsum(L==R)

4

2 に答える 2

4

std::countには述語形式std::count_ifがあり、ドキュメントでは左辺値で引数を取得することが示唆されています。

したがって、 &arg から距離/インデックスを取得し、両方の値をチェックして、2 つの配列をキャプチャするラムダを一緒にハックできると思います。昔ながらの for ループの代わりに、そのように使用するとは思えません。

于 2013-06-06T10:57:42.307 に答える
1

これに使用できますzip。こちらをご覧くださいc++ 11のSequence-zip function?

そして、count_if述語を使用すると、そのタプルには同一の要素しかありません。

また、単純にペアの配列を作成して同じことを行うこともできます。

ペアで数えるためのこのようなもの。

void someFunc(const float** inputChannelData, size_t offset)
{
   const float* R = inputChannelData[0];
   const float* L = inputChannelData[1];
   std::vector<std::pair<int, int>> pairs;
   std::transform(L, L + offset, R, std::back_inserter(pairs),
   [](float l, float r)
   {
      return std::make_pair(l, r);
   });
   size_t equal_pairs = std::count_if(pairs.begin(), pairs.end(),
   [](const std::pair<float, float>& p)
   {
      return p.first == p.second;
   });
}
于 2013-06-06T10:57:34.753 に答える