點乘與叉乘是線性代數(shù)的基本知識,在工作中也經(jīng)常能夠遇到,下面我們來溫習(xí)一下它們的概念以及使用C++代碼對它們進(jìn)行實現(xiàn)。
1. 點乘
- 概念
向量的點乘,也叫點積、內(nèi)積、數(shù)量積。是指在實數(shù)R上的兩個向量的一種二元運(yùn)算,這種運(yùn)算返回一個實數(shù)值標(biāo)量。點乘有兩種定義方式:代數(shù)方式和幾何方式。
- 代數(shù)方式
已知兩個向量
a
→
=
[
a
1
,
a
2
,
.
.
.
,
a
n
]
\overrightarrow{a} = [a_1, a_2,...,a_n]
a=[a1?,a2?,...,an?]和
b
→
=
[
b
1
,
b
2
,
.
.
.
,
b
n
]
\overrightarrow = [b_1, b_2,...,b_n]
b=[b1?,b2?,...,bn?],則向量
a
→
\overrightarrow{a}
a與向量
b
→
\overrightarrow
b的內(nèi)積代數(shù)定義為:
a
?
b
=
a
1
b
1
+
a
2
b
2
+
.
.
.
+
a
n
b
n
a\cdot b=a_1b_1+a_2b_2+...+a_nb_n
a?b=a1?b1?+a2?b2?+...+an?bn?代數(shù)表示
:對應(yīng)元素相乘相加。
- 幾何定義(2維和3維)
已知兩個向量
a
→
=
[
x
1
,
y
1
,
z
1
]
\overrightarrow{a} = [x_1,y_1,z_1]
a=[x1?,y1?,z1?]和
b
→
=
[
x
2
,
y
2
,
z
2
]
\overrightarrow=[x_2,y_2,z_2]
b=[x2?,y2?,z2?],它們的模值分別為
∣
a
∣
|a|
∣a∣和
∣
b
∣
|b|
∣b∣,它們的夾角為
θ
∈
?
[
0
,
π
]
\theta \in \ [0,\pi]
θ∈?[0,π],那么向量
a
→
\overrightarrow{a}
a與向量
b
→
\overrightarrow
b的幾何定義為:
a
?
b
=
∣
a
∣
∣
b
∣
c
o
s
θ
a\cdot b = |a||b|cos\theta
a?b=∣a∣∣b∣cosθ幾何意義
: 可以用來表示一個向量在另一個向量上的投影長度
,為一個標(biāo)量。
2. 叉乘
向量的叉乘,也叫叉積、外積、向量積,是一種在向量空間中(也就是說向量元素個數(shù)為3)向量的二元運(yùn)算。與點積不同,叉乘的運(yùn)算結(jié)果是一個向量而不是一個標(biāo)量,并且兩個向量的叉積與這兩個向量所構(gòu)成的平面垂直。
- 定義方式
已知兩個向量 a → = [ x 1 , y 1 , z 1 ] \overrightarrow{a} = [x_1,y_1,z_1] a=[x1?,y1?,z1?]和 b → = [ x 2 , y 2 , z 2 ] \overrightarrow=[x_2,y_2,z_2] b=[x2?,y2?,z2?],它們的模值分別為 ∣ a ∣ |a| ∣a∣和 ∣ b ∣ |b| ∣b∣,它們的夾角為 θ ∈ ? [ 0 , π ] \theta \in \ [0,\pi] θ∈?[0,π],那么向量 a → \overrightarrow{a} a與向量 b → \overrightarrow b的叉乘表示為:
模值
: ∣ a × b ∣ = ∣ a ∣ ∣ b ∣ s i n θ |a × b | = ∣ a ∣ ∣ b ∣ s i n θ ∣a×b∣=∣a∣∣b∣sinθ模的幾何意義
:模 ∣ a × b ∣ |a × b | ∣a×b∣, 即以a和b為兩條邊的平行四邊形的面積
方向
:兩個向量的叉積與這兩個向量所構(gòu)成的平面垂直,且遵循右手準(zhǔn)則
(右手的四指從a以不超過180°的轉(zhuǎn)角
轉(zhuǎn)向b時,豎起的大拇指指向是叉乘的方向。)
- 坐標(biāo)運(yùn)算
假設(shè): i 、 j 、 k i、j、k i、j、k分別為XYZ三個軸的單位向量,則叉乘運(yùn)算表示如下:
a → × b → = ∣ i j k x 1 y 1 z 1 x 2 y 2 z 2 ∣ = [ y 1 z 2 ? y 2 z 1 , ? ( x 1 z 2 ? x 2 z 1 ) , x 1 y 2 ? x 2 y 1 ] \overrightarrow{a}×\overrightarrow = \begin{vmatrix} i& j& k\\ x_1& y_1& z_1 \\ x_2& y_2& z_2 \\ \end{vmatrix}=[y_1z_2-y_2z_1,-(x_1z_2-x_2z_1),x_1y_2-x_2y_1] a×b=∣ ∣?ix1?x2??jy1?y2??kz1?z2??∣ ∣?=[y1?z2??y2?z1?,?(x1?z2??x2?z1?),x1?y2??x2?y1?]
特殊情況,如果a和b在平面XY上,那么Z=0,所以上面得到的值 ∣ x 1 y 2 ? x 2 y 1 ∣ |x_1y_2 - x_2y_1| ∣x1?y2??x2?y1?∣,方向朝Z軸。
3. 代碼實現(xiàn)
根據(jù)對上面概念的理解,相信大家可以很快就能寫出自己的點乘與叉乘函數(shù)操作,這里就不介紹了。在工作實際應(yīng)用中,我們可能更多的使用Eigen對它們進(jìn)行調(diào)用,Eigen可以很方便的實現(xiàn)點乘與叉乘操作,具體代碼如下:文章來源:http://www.zghlxwxcb.cn/news/detail-439109.html
#include <iostream>
#include <Eigen/Dense>
using namespace Eigen;
using namespace std;
int main()
{
Vector3d v(1,2,3);
Vector3d w(0,1,2);
cout << "Dot product: " << v.dot(w) << endl;//點乘
double dp = v.adjoint()*w; //等同于點法
cout << "Dot product via a matrix product: " << dp << endl;
cout << "Cross product:\n" << v.cross(w) << endl;//叉乘
}
輸出:文章來源地址http://www.zghlxwxcb.cn/news/detail-439109.html
到了這里,關(guān)于向量的點乘與叉乘概念理解以及C++代碼實現(xiàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!