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,UK2UK3in

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

应该。我怀疑UK1应该是一个用 svector填充的,与s 中的s0.0f大小相同。也许应该是vectorbarUK3

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是乘法运算,将两个序列的相应元素相乘并返回 的和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 回答