3

aと ainner_productを組み合わせる方法を理解するのに苦労しています。与えられた、例えば、そして、私は生産したいstd::vector<float>std::vector<std::vector<float>><2,3><<4,5>,<6,7>>inner_product

2*<4,5> + 3*<6,7> = <8,10> + <18,21> = <26,31>.

仮定すると

vector<float> foo;

vector<vector<float>> bar;

は初期化されておりUK1、サイズは同じです。UK2UK3

vector<float> ip = 
              inner_product(foo.begin(), foo.end(), bar.begin(), UK1, UK2, UK3);

する必要があります。は の と同じサイズの で満たされてUK1いるはずです。おそらく次のようなものになるはずですvector0.0fvectorbarUK3

std::transform(UK4.begin(), UK4.end(), UK4.begin(),
                                   std::bind1st(std::multiplies<float>(), UK5));

UK2そして、どういうわけかコンポーネントごとの加算を表す必要があると思いますvector<float>!

barベクトルが属性を持つクラスのオブジェクトに置き換えられたときに、これがどれほど複雑になるかについては考えたくありませんfloat...

4

2 に答える 2

4

加算関数と乗算関数を次のように定義します。

static vector<float> add(const vector<float> &a,const vector<float> &b)
{
  assert(a.size()==b.size());
  size_t n = a.size();
  vector<float> result(n);
  for (size_t i=0; i!=n; ++i) {
    result[i] = a[i]+b[i];
  }
  return result;
}

static vector<float> mul(const float &a,const vector<float> &b)
{
  size_t n = b.size();
  vector<float> result = b;
  for (size_t i=0; i!=n; ++i) {
    result[i] *= a;
  }
  return result;
}

そして、次のように使用します。

vector<float> zero(2,0);
vector<float> result =
  inner_product(a.begin(),a.end(),b.begin(),zero,add,mul);
于 2012-07-27T13:59:10.237 に答える
1

std::inner_product額を積み上げます。UK2和演算です。UK1は通常、 の中立要素ですUK2UK3は、2 つのシーケンスの対​​応する要素を乗算し、 の被加数を返す乗算演算ですUK2

std::valarrayこの操作には、より適切なコンテナーを提供する必要があると思います。

// this is c++11
#include <vector>
#include <valarray>
#include <algorithm>
#include <iostream>

int main ()
{
    std::valarray <int> zero = { 0, 0 };
    std::vector <int> foo = { 1, 2, 3 };
    std::vector <std::valarray<int>> bar = { { 3, 4 }, { 5, 6 }, { 7, 8 } };
    std::valarray<int> result = std::inner_product (foo.begin(), foo.end(), 
                                     bar.begin(), zero);
    for(auto n : result) {
        std::cout << n << ' '; 
    }               
    std::cout << std::endl;
}
于 2012-07-27T14:10:33.273 に答える