矢量数组,计算点积

时间:2017-09-18 14:56:46

标签: c++ arrays loops vector structure

我正在尝试编写计算两个给定向量的点积的C ++程序。在向量a和b中,只有非零元素将存储在结构数组中。每次我得到不相关的结果。正确的结果是50.我想我无法将矢量正确地读入结构数组。请指教。提前谢谢

#include <iostream>
#include <vector>
using namespace std;

const int n=10; /* vector size limit */
struct element {
int x; /* original index of non-zero array element */
int val ; /* integer non-zero value at index x */
};
element row[n];
element col[n];

int i;
vector<int> a={0,0,7,0,5,0,0,8,0,4,-1};
vector<int> b={0,0,0,5,6,0,0,0,0,5,-1};

void generate_row_and_col()
 {
    for (i=0; i<=n; i++)
    {
        if(a[i]=!0)
        {
            row[i].x=i;
            row[i].val=a[i];
        }
    }
    for (i=0; i<=n; i++)
    {
        if(b[i]!=0)
        {
           col[i].x=i;
           col[i].val=b[i];
        }
    }
}
int dotproduct()
{
/* calculate the dot product of row and col output the result*/
int i=0;
int j=0;
int product=0;
while(row[i].x!=-1 && col[j].x!=-1)
{
    if(row[i].x == col[j].x)
    {
        product=product+row[i].val*col[j].val;
        i++;
        j++;
    }
    else if(row[i].x<col[j].x)
    {
        i++;
    }
    else
    {
        j++;
    }
}
return product;
}
int main()
{
generate_row_and_col() ;
int r;
r=dotproduct();
cout<<"result="<<r<<endl;
return 0;
}

4 个答案:

答案 0 :(得分:2)

标准库有std::inner_product 完全此目的。使用它可以将代码缩减为:

#include <numeric>
#include <iostream>
#include <vector>

int main() {
    std::vector<int> a = { 0,0,7,0,5,0,0,8,0,4 };
    std::vector<int> b = { 0,0,0,5,6,0,0,0,0,5 };

    std::cout << std::inner_product(a.begin(), a.end(), b.begin(), 0);
}

答案 1 :(得分:1)

使用= !0是一个错误。那应该是!= 0

我仍在猜测目标,但也许另一个清理版本有帮助:

<强> Live On Coliru

#include <iostream>
#include <vector>
#include <map>
using namespace std;

using Ints = vector<int>;
using Vec = map<int, int>;
Vec row, col;

Vec to_sparse_vec(Ints const& a) {
    Vec v;
    for (size_t i = 0; i < a.size(); ++i) {
        if (a[i] != 0) v[i] = a[i];
    }
    return v;
}

int dotproduct(Vec row, Vec col) {
    size_t n = max(row.rbegin()->first, col.rbegin()->first);

    int product = 0;
    for (size_t i = 0; i <= n; ++i) {
        if (row[i] && col[i])
            product += row[i] * col[i];
    }
    return product;
}

int main() {
    auto row = to_sparse_vec({ 0, 0, 7, 0, 5, 0, 0, 8, 0, 4 });
    auto col = to_sparse_vec({ 0, 0, 0, 5, 6, 0, 0, 0, 0, 5 });
    cout << "result=" << dotproduct(row, col) << endl;
}

这假设Vec表示旨在作为“稀疏向量”。

结果是50(删除-1元素)

答案 2 :(得分:0)

您可以简化代码

#include <iostream>
#include <vector>

using namespace std;

template<class InputIt1, class InputIt2, class T>
T dot_product(InputIt1 first1, InputIt1 last1,
                InputIt2 first2, T value)
{
    while ((first1 != last1)&&(*first1!=-1) && (*first2 !=-1)) {
         value = value + *first1 * *first2;
         ++first1;
         ++first2;
    }
    return value;
}

const int n=10; /* vector size limit */
struct element {
    int x; /* original index of non-zero array element */
    int val ; /* integer non-zero value at index x */
};
element row[n];
element col[n];

int i;
vector<int> a={0,0,7,0,5,0,0,8,0,4,-1};
vector<int> b={0,0,0,5,6,0,0,0,0,5,-1};

int main()
{
    int r;
    r=dot_product(a.begin(), a.end(), b.begin(), 0);
    cout<<"result="<<r<<endl;
    return 0;
}

输出

50

Demo

答案 3 :(得分:0)

我对代码做了一些更改,现在工作正常。但是,在generate_row_and_col函数的初始化row和col数组期间,我只初始化具有非零元素的索引,其余部分未初始化。这不会导致这个程序出现任何错误,但是在良好的编程实践方面,那些具有0值的索引不会启动,并且数组看起来像(垃圾,垃圾,7,垃圾,5,垃圾,垃圾.... )。我们可以只限制generate_row_and_col函数,因此我们只能存储非零值索引。 谢谢

#include <iostream>
#include <vector>
using namespace std;

const int n=11; /* vector size */

struct element {
int index; /* original index of non-zero array element */
int value ; /* integer non-zero value at index x */
};
element row[n];
element col[n];

vector<int> a={0,0,7,0,5,0,0,8,0,4,-1};
vector<int> b={0,0,0,5,6,0,0,0,0,5,-1};

void generate_row_and_col()
{
    for (int i=0; i<n; i++)
    {
        if(a[i]!=0)
        {
            row[i].index=i;
            row[i].value=a[i];
        }
    }
    for (int j=0; j<n; j++)
    {
        if(b[j]!=0)
        {
           col[j].index=j;
           col[j].value=b[j];
        }
    }
}
int dotproduct()
{
/* calculate the dot product of row and col output the result*/
int i=0;
int j=0;
int product=0;
while(row[i].value!=-1 && col[j].value!=-1)
{
    if(row[i].index == col[j].index)
    {
        product=product+row[i].value*col[j].value;
        i++;
        j++;
    }
    else if(row[i].index<col[j].index)
    {
        i++;
    }
    else
    {
        j++;
    }
}
return product;
}

int main()
{
    generate_row_and_col() ;
    int r;
    r=dotproduct();
    cout<<"Dot Product = "<<r<<endl;
    return 0;
}