點乘和叉乘及其物理意義(C STL實現)

2021-07-07 05:03:57 字數 3454 閱讀 3689

一些錯誤觀念的澄清,比如數學意義上的點積叉積並不對應matlab程式中的.*(按位相乘)和*(矩陣乘法)

內積的物理意義

叉積的意義

如何使用c++語言(stl容器,運算子過載):

又叫點乘,點積(dot product),數量積,顧名思義得到的是乙個標量(scalar)。 向量

x=[x

1,x2

,…,x

n]和y=[

y1,y

2,…,

yn] 的內積定義為:x⋅

y=∑i

nxiy

i=x1

y1+x

2y2+

⋯+xn

yn也即:內積等於向量的對應位相乘再相加,如果從函式的觀點來看的話,即是兩個向量相互作用得到乙個標量。

內積對相互作用的兩個向量x,

y 的長度也即各自所含元素的個數是沒有限制的。這點不同於向量叉積,叉積所要的向量長度最高為3.

歐式空間中,向量是乙個同時擁有長度和方向的幾何物件。向量

x 的長度記為∥x

∥,兩個向量的內積定義為:x⋅

y=∥x

∥∥y∥

cosθ

θ標識著兩向量的夾角。可見當向量正交時,θ=

90∘,x⋅y

=0。

當向量y

被歸一化為長度為1的單位向量時,x⋅

y=∥x

∥cos

θ,我們來考察x,

y 均為二維的情形:

如上圖所示,此時二者的內積表示的恰是其中乙個向另外乙個的投影,投影長度越小,說明二者的夾角越大,反之亦然。當兩向量同時歸一化為1時,此時內積的定義為:x⋅

y=co

sθ,內積越大,說明兩者夾角越小,也間接地說明兩者也就越相似,故在許多機器學習的演算法,常用余弦相似性來度量兩特徵向量的逼近程度。內積既然能夠表徵兩向量的夾角,自然判斷兩向量是否正交(值為0)就更不在話下了。

又叫叉乘(cross product)或者外積,它的計算結果是乙個向量而非標量。叉積所在的向量與參與運算的兩個向量都正交,也即正交於原來的兩個向兩邊所決定的平面,也即兩向量所決定的平面的法向量可通過計算叉積的方式得以確定。當參與運算的兩向量是平行的兩個向量時,得到的叉積為0,也即可通過計算叉積的方式判斷兩向量是否平行。x×

根據如圖的計算方法可得:u×

v===

=∣∣∣

∣iu1

v1ju

2v2k

u3v3

∣∣∣∣

(u2v

3i+u

3v1j

+u1v

2k)−

(u3v

2i+u

1v3j

+u2v

1k)(

u2v3

−u3v

2)i+

(u3v

1−u1

v3)j

+(u1

v2−u

2v1)

k(u2

v3−u

3v2,

u3v1

−u1v

3,u1

v2−u

2v1)

x×y=∥x∥

∥y∥s

inθn

⃗  n⃗ 

表示叉積方向上的單位向量。

中學知識告訴我們三角形的面積計算公式為: s=

∥x∥∥

y∥si

nθ2=

∥z∥h

2 其中θ

表示的是x,

y 之間的夾角,由以上兩個公式我們可得到三角形的高或者點到其所對的邊的距離,也即點到直線的距離,的計算公式: h=

∥x×y

∥/∥z

typedef

vector

vec;

vec operator-(const vec& x, const vec& y)

為了形式的簡單,我們在c++中以*表示內積,以^表示叉積,分別對二者進行運算子過載:

double

operator*(const vec& x, const vec& y)

// 三維的情況

vec operator^(const vec& x, const vec& y)

; // uniform initialization, c++11新特性

}// 二維就姑且返回其模長吧

double twodcrossprod(const vec& x, const vec& y)

double norm(const vec& x)

#define pi 3.14159265358979323846

// 弧長向弧度的轉換

double todegree(double val)

double angle(const vec& x, const vec& y)

// x0, x1, x2 分別表示三角形的三個頂點的座標

// 這裡計算的是點x0到x1和x2構成的直線的距離

double

distance(const vec& x0, const vec& x1, const vec& x2)

客戶端程式:

int main(int, char**)

, y;

vec z = x^y; // 計算叉乘

copy(z.begin(), z.end(), ostream_iterator(cout, " "));

cout

<< endl;

// 0 0 1

vec alpha, beta;

cout

<< angle(alpha, beta) << endl;

// 45

vec x0, x1, x2;

cout

<< distance(x0, x1, x2) << endl;

// 1/sqrt(2)

return

0;}

點乘和叉乘

目錄 定義 點乘公式 點乘幾何意義 叉乘公式 叉乘幾何意義,問題 我知道向量乘分為叉乘和點乘,矩陣乘不分什麼叉乘和點乘吧?如果存在各是什麼?線性代數上沒有,但在一些高階書上也有人提矩陣的叉乘,點乘.不能理解 矩陣也可構成乙個空間,也就是可以作為向量,自然也就有內積 點乘 外積 叉乘 定義方式一致.向...

點乘和叉乘

點乘,也叫向量的內積 數量積。顧名思義,求下來的結果是乙個數。向量a 向量b a b cos 在物理學中,已知力與位移求功,實際上就是求向量f與向量s的內積,即要用點乘。叉乘,也叫向量的外積 向量積。顧名思義,求下來的結果是乙個向量,記這個向量為c。向量c 向量a 向量b a b sin 向量c的方...

點乘和叉乘

向量是由n個實數組成的乙個n行1列 n 1 或乙個1行n列 1 n 的有序陣列 向量的點乘,也叫向量的內積 數量積,對兩個向量執行點乘運算,就是對這兩個向量對應位一一相乘之後求和的操作,點乘的結果是乙個標量。對於向量a和向量b a和b的點積公式為 要求一維向量a和向量b的行列數相同。點乘的幾何意義是...