0

我正在尝试为我的编程任务实现一个欧几里得向量。我需要重载 operator* 来为具有任意相同维度的两个向量提供点积计算。以 3D 向量为例:

向量<3> v1, v2; //两个3D向量。

双点积 = v1 * v2;

dotProduct 的值应该是 v1[0]*v2[0]+v1[1]*v2[1]+v1[2]*v2[2]

所以,我的问题是如何在不使用 numeric.h 头文件中的任何显式循环和 std::accumulate() 操作的情况下获取此值?因为那些在这个任务中是被禁止的。

PS 我可以将仿函数(自定义)与 STL 算法一起使用。

4

4 回答 4

2

如果你真的想避免一般的显式循环和算法(不仅仅是std::accumulate),你可以使用std::valarrays 代替:

std::valarray<double> a;
std::valarray<double> b;

// code to put data in a and b goes here

double dotProduct = (a * b).sum();

我在double这里使用了类型,但您(当然)可以使用对您正在处理的数据/情况有意义的任何类型。

于 2012-11-03T03:14:25.703 回答
1

您可以使用std::inner_product,请参阅http://en.cppreference.com/w/cpp/algorithm/inner_product

double dotProduct = std::inner_product(v1.begin(), v1.end(), v2.begin());
于 2016-03-16T16:03:03.970 回答
0

如果你不能使用显式循环,也许你的老师要求你使用递归。

template<int N>
int VectorSum(const Vector<N>& v1, const Vector<N>& v2, int m) {
  if(m) return v1[m]*v2[m] + VectorSum(v1, v2, m-1);
  return v1[0]*v2[0];
}

template<int N>
int operator+(const Vector<N>& v1, const Vector<N>& v2) {
  return VectorSum(v1, v2, N-1);
}
于 2012-11-03T03:06:58.870 回答
0

我碰巧读了一篇关于它的文章,所以我复制给你。可能是在书中介绍的:C++ 模板:完整指南。

#include <iostream>

template<int DIM,typename T>
struct DotProduct {
    static T execute(const T v1[],const T v2[]);
};
template<int DIM,typename T>
T DotProduct<DIM,T>::execute(const T v1[],const T v2[]) {
    return v1[0]*v2[0] + DotProduct<DIM-1,T>::execute(v1+1,v2+1);
};

template<typename T>
struct DotProduct<1,T> {
    static T execute(const T v1[],const T v2[]);
};

template<typename T>
T DotProduct<1,T>::execute(const T v1[],const T v2[]) {
    return v1[0]*v2[0];
};

int main()
{
    int v1[] = {1,2,3}; 
    int v2[] = {4,5,6};
    int r2 = DotProduct<3,int>::execute(v1,v2);
    std::cout << r2 << std::endl;
    return 0;
}
于 2012-11-03T12:08:20.293 回答