在C++中做两个矢量的点积的两种不同方法

660 阅读2分钟

在这篇文章中,我们介绍了在C++中做两个矢量的点积的两种不同方法。这涉及到C++ STL(标准模板库)中inner_product方法的使用。

目录:

  1. 向量和点积的介绍
  2. C++中的点积:迭代法
  3. C++中的点积:STL中的inner_product法

前提是。C++ STL中的向量

让我们开始学习C++中两个向量的点积。

矢量和点积的介绍

矢量是一个既有大小又有方向的物理量,而标量是一个只有大小而没有方向的物理量。

点积的几何定义将两个向量ab之间的点积定义为

a.b = |a||b|cosθ 

在矢量代数中,点积是两个矢量的相应元素的乘积之和。
一对不同的标准单位矢量(单位矢量是量级为1的矢量)之间的点积为零:

i⋅j = i⋅k = j⋅k = 0.

i、j和k分别是沿x、y和z方向的单位向量。

一个单位向量与它本身的点积是1:

ii = j⋅j = k⋅k = 1

例如,我们给出两个向量V1 = a1*i + b1*j + c1*kV2 = a2*i + b2*j + c2*k ,其中i、j和k是沿x、y和z方向的单位向量。那么点积的计算方法是

V1.V2 = a1*a2 + b1*b2 + c1*c2 

点积的结果是一个标量。

C++中的点积:迭代法

  1. 使用迭代法
#include <bits/stdc++.h>
using namespace std;

int dot_product(vector<int> &v1, vector<int> &v2){
    int product = 0;
    for(int i=0;i<v1.size();i++)
        product += v1[i] * v2[i];
    return product;
}
int main() {
    vector<int> V1 ;
    vector<int> V2;
    int length1,length2,input,product = 0;
    cout<<"Enter size of first vector:";
    cin >> length1;
    cout<<"Enter size of second vector:";
    cin >> length2;
    cout << "Enter elements of the first vector:";
    for(int i=0;i<length1;i++){
        cin>>input;
        V1.push_back(input);
    }
    cout << "Enter elements of the second vector:";
    for(int i=0;i<length2;i++){
        cin>>input;
        V2.push_back(input);
    }
    cout << "Dot product : " << dot_product(V1,V2);
    return 0;
}

输出:

Enter size of first vector:5
Enter size of second vector:5
Enter elements of the first vector:1 2 3 4 5
Enter elements of the second vector:2 4 6 8 10
Dot product : 110

解释
这里我们通过向量进行迭代,找到相应元素的乘积之和,即

1*2 + 2*4 + 3*6 + 4*8 + 5*10 = 110

C++中的点积:STL中的inner_product

  1. 使用std::inner_product
#include<iostream>
#include<numeric>
#include<vector>
using namespace std;
int main(){
    vector<int> v1 { 1, 2, 3, 4, 5,};
    vector<int> v2 { 2, 4, 6, 8, 10};
    cout << "Dot Product : " << inner_product(v1.begin(), v1.end(), v2.begin(), 0) << endl;
}

输出:

Dot Product : 110

解释:

std::inner_product被包含在<numeric> 头文件中。它计算两个范围的乘积之和。第一个范围是由begin/end 迭代器给出的,表示第一个序列中的初始和最终位置。第二个范围只由初始位置给出。它需要的元素数量与第一个范围相同。该方法需要另一个参数,init ,它是乘积之和的初始值。这里我们的初始值是0 。返回值是init和给定范围内所有元素对的乘积的累积结果。

通过OpenGenus的这篇文章,你一定对如何在C++原生和使用C++ STL中的函数做两个向量的点积有了深刻的认识。