java 向量 内积_向量内积&外积

一、向量的内积

1.1向量内积的定义

概括地说,向量的内积(点乘/点积/数量积)就是对两个向量执行点乘运算,即对这两个向量对应位一一相乘之后求和的操作,如下所示,对于向量a和向量b:

60ea5c2d9566647307d860dde0ed0ad5.gif                

612f09b41819ba026c234b54deb951e2.gif

a和b的点积公式为:

ccc31bb38acd79ff8dbf47bc78eb453f.gif

这里要求一维向量a和向量b的行列数相同。注意:点乘的结果是一个标量(数量而不是向量).

定义:两个向量a与b的内积为 a·b = |a||b|cos∠(a, b),特别地,0·a =a·0 = 0;若a,b是非零向量,则a与b正交的充要条件是a·b = 0。

1.2向量内积的性质

a^2 ≥ 0;当a^2 = 0时,必有a = 0(正定性)

a·b = b·a (对称性)

(λa + μb)·c = λa·c + μb·c,对任意实数λ, μ成立(线性)

cos∠(a,b) =a·b/(|a||b|)

|a·b| ≤ |a||b|,等号只在a与b共线时成立

1.3向量内积的几何意义

内积(点乘)的几何意义包括:

表征或计算两个向量之间的夹角

b向量在a向量方向上的投影

公式

072df77d538161833430449df6678442.gif推导过程如下,首先看一下向量组成:

ed8970a219f79032338f38f7396f36df.png

根据余弦定理有:

0727f8bfdf3848ea146f67e035c1ddb2.gif

将c=a-b带入上式中得出:

d58b2f9b7c48475e599849c107abea38.gif

因此可以得出:

072df77d538161833430449df6678442.gif

向量a,b的长度都是可以计算的已知量,从而有a和b间的夹角θ:

e75d5b81f3c20e6f7788eafb86f47a46.gif

进而可以进一步判断两个向量是否同一方向或正交(即垂直)等方向关系,具体对应关系为:

a∙b>0→方向基本相同,夹角在0°到90°之间

a∙b=0→ 正交,相互垂直

a∙b<0→ 方向基本相反,夹角在90°到180°之间

二、向量的外积

2.1向量外积的定义

概括地说,两个向量的外积,又叫叉乘、叉积向量积,其运算结果是一个向量而不是一个标量。并且两个向量的外积与这两个向量组成的坐标平面垂直。

定义:向量a与b的外积a×b是一个向量,其长度等于|a×b| = |a||b|sin∠(a,b),其方向正交于a与b。并且,(a,b,a×b)构成右手系。 特别地,0×a = a×0 = 0.此外,对任意向量a,a×a=0。

对于向量a和向量b:

035047c03fd03cf3d4cfd75cf002cf74.gif

c1d2722331c0cc0967aacfcec142f732.gif

a和b的外积公式为:

f73d66a29a9c3bf13f2ba35e3ebc4fd8.gif

其中:

f3d1dc29c9a97f93981b03523a8c69ec.gif             

430951e8a6e9afa18088edc462000f93.gif            

ddd411933d6aec66b149ef3de23a4bca.gif

根据i、j、k间关系,有:

a8ad4c2783eacac2a73527a272a08bb0.gif

2.2向量外积的性质

a × b = -b × a. (反称性)

(λa + μb) × c = λ(a ×c) + μ(b ×c). (线性)

2.3向量外积的几何意义

在三维几何中,向量a和向量b的外积结果称为法向量,该向量垂直于a和b向量构成的平面。在3D图像学中,外积的概念非常有用,可以通过两个向量的外积,生成第三个垂直于a,b的法向量,从而构建X、Y、Z坐标系。如下图所示:

802f3949746ee48618b2d4d173cf0efc.png

在二维空间中,外积还有另外一个几何意义:|a×b|在数值上等于由向量a和向量b构成的平行四边形的面积。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
/* * 基于数组的向量实现 */ package dsa; public class Vector_Array implements Vector { private final int N = 1024;//数组的容量 private int n = 0;//向量的实际规模 private Object[] A;//对象数组 //构造函数 public Vector_Array() { A = new Object[N]; n = 0; } //返回向量中元素数目 public int getSize() { return n; } //判断向量是否为空 public boolean isEmpty() { return (0 == n) ? true : false; } //取秩为r的元素 public Object getAtRank(int r)//O(1) throws ExceptionBoundaryViolation { if (0 > r || r >= n) throw new ExceptionBoundaryViolation("意外:秩越界"); return A[r]; } //将秩为r的元素替换为obj public Object replaceAtRank(int r, Object obj) throws ExceptionBoundaryViolation { if (0 > r || r >= n) throw new ExceptionBoundaryViolation("意外:秩越界"); Object bak = A[r]; A[r] = obj; return bak; } //插入obj,作为秩为r的元素;返回该元素 public Object insertAtRank(int r, Object obj) throws ExceptionBoundaryViolation { if (0 > r || r > n) throw new ExceptionBoundaryViolation("意外:秩越界"); if (n >= N) throw new ExceptionBoundaryViolation("意外:数组溢出"); for (int i=n; i>r; i--) A[i] = A[i-1];//后续元素顺次后移 A[r] = obj;//插入 n++;//更新当前规模 return obj; } //删除秩为r的元素 public Object removeAtRank(int r) throws ExceptionBoundaryViolation { if (0 > r || r >= n) throw new ExceptionBoundaryViolation("意外:秩越界"); Object bak = A[r]; for (int i=r; i<n; i++) A[i] = A[i+1];//后续元素顺次前移 n--;//更新当前规模 return bak; } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值