2012-07-27 23 views
3

我在使用inner_product來合併std::vector<float>std::vector<std::vector<float>>時遇到困難。考慮到,例如,<2,3><<4,5>,<6,7>>,我想inner_product生產正在調用inner_product(C++ STL)的自定義調用

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

假設

vector<float> foo; 

vector<vector<float>> bar; 

初始化和大小相同,我不知道什麼UK1,UK2UK3

​​

應該是。我懷疑UK1應該是vector填充0.0f s,其大小與bar中的vector s大小相同。 UK3或許應該是這樣的

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

我猜UK2應該以某種方式代表逐分量vector<float>除了!

我甚至不想去思考如何更復雜時bar的載體是通過與float屬性的類的對象替換,這將成爲...

回答

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); 
1

std::inner_product積累的總和。 UK2是總和操作。 UK1通常是UK2的中性元素。 UK3是乘法操作,將兩個序列的相應元素相乘並返回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; 
}