0

プログラミングの課題でユークリッド ベクトルを実装しようとしています。operator* をオーバーロードして、任意の同じ次元を持つ 2 つのベクトルの内積計算を提供する必要があります。たとえば、3D ベクトルとして:

ベクトル<3> v1、v2; //2 つの 3D ベクトル。

double dotProduct = v1 * v2;

dotProduct の値は v1[0]*v2[0]+v1[1]*v2[1]+v1[2]*v2[2] である必要があります

したがって、私の問題は、numeric.h ヘッダー ファイルで明示的なループと std::accumulate() 操作を使用せずにこの値を取得する方法ですか? この課題ではそれらが禁止されているためです。

PS私はSTLアルゴリズムと一緒にfunctor(自己定義)を使うかもしれません。

4

4 に答える 4

2

( だけでなく) 一般的な明示的なループとアルゴリズムを本当に避けたい場合は、代わりに s をstd::accumulate使用できます。std::valarray

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

を使用できます。http://en.cppreference.com/w/cpp/algorithm/inner_productstd::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++ Templates: The Complete Guide.

#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 に答える