电脑做运算时,常会有浮点数误差的问题。为避免浮点数误差的问题,用电脑计算几何问题时,会採用不同于一般数学运算时所用的公式和定理。
内积(inner product、dot product)、外积(outer product、cross product)这两个运算只用了加法和乘法,而不包括除法,故能有效的避免除法所產生的浮点数误差。内积与外积有许多很有用的特性。大部分的几何问题,都可以用内积与外积来计算答案。
此处仅作简单介绍。不失一般性,以下都用二维空间当作范例。
内积与外积是向量运算,所以得设计一个向量的资料结构。
struct Vector {int x, y;}; // 二维向量的资料结构
// 内积运算
int dot(Vector& v1, Vector& v2)
{
return v1.x * v2.x + v1.y * v2.y; // 没有除法,尽量避免误差。
}
// 外积运算,回传纯量(除去方向)
int cross(Vector& v1, Vector& v2)
{
return v1.x * v2.y - v1.y * v2.x; // 没有除法,尽量避免误差。
}
struct Vector {int x, y;}; // 二维向量的资料结构
// 内积运算
int dot(Vector& v1, Vector& v2)
{
return v1.x * v2.x + v1.y * v2.y; // 没有除法,尽量避免误差。
}
// 外积运算,回传纯量(除去方向)
int cross(Vector& v1, Vector& v2)
{
return v1.x * v2.y - v1.y * v2.x; // 没有除法,尽量避免误差。
}
向量资料结构拥有一个座标,并拥有一支内积函式与一支外积函式。
两个向量做内积的结果是一个纯量。两个向量做外积的结果为一个向量,然而我们通常只会用到纯量部份,所以让外积函式的回传值为纯量。
内积、外积跟长度的关係
内积后取绝对值,求得的是投影量,再除以投影标的的单位向量,则得到投影长度。
外积后取绝对值,求得的是平行四边形的面积量,再除以底的单位向量,则得到高。
![](http://dl.iteye.com/upload/picture/pic/60515/a0b60fba-9106-340d-85e3-cdf70580aea0.png)
struct Point {double x, y;}; // 点的资料结构
typedef Point Vector; // 向量的资料结构,和点一样
// 内积运算
double dot(Vector& v1, Vector& v2)
{
return v1.x * v2.x + v1.y * v2.y;
}
// 外积运算,回传纯量(去除方向)
double cross(Vector& v1, Vector& v2)
{
return v1.x * v2.y - v1.y * v2.x;
}
// 向量的长度
double length(Vector& v)
{
return sqrt(v1.x * v1.x + v2.y * v2.y);
// return sqrt(dot(v, v));
}
void print_d1_and_d2()
{
Point p, p1, p2;
Vector v1 = p1 - p, v2 = p2 - p;
cout << "d1:" << fabs(dot(v1, v2)) / length(v1);
cout << "d2:" << fabs(cross(v1, v2)) / length(v1);
}
内积、外积跟角度的关系
![](http://dl.iteye.com/upload/picture/pic/60517/4b969647-a596-3a88-8896-e5c55b4421cd.png)
void print_θ()
{
Point p, p1, p2;
Vector v1 = p1 - p, v2 = p2 - p;
double l1 = length(v1), l2 = length(v2);
cout << "cos(θ):" << dot(v1, v2) / l1 / l2;
cout << "sin(θ):" << cross(v1, v2) / l1 / l2;
cout << "θ:" << acos(dot(v1, v2) / l1 / l2); // [0, π]
cout << "θ:" << asin(cross(v1, v2) / l1 / l2); // [-π/2, π/2]
}
注意到acos与asin的回传值,回传的结果是弪度量(radian)而非度度量(grade),而且回传值的范围也不同。一般都以内积与acos求得介于0˚到180˚之间的夹角大小。
内积与向量夹角
利用内积的性质,可以粗略判断夹角大小:内积大于0时,两向量夹角小于90˚;等于0时,夹角等于90˚;小于零时,夹角大于90˚且小于180˚。
外积与向量旋转
外积大于0时,两向量前后顺序为逆时针顺序(在180˚之内);等于0时,两向量平行,也就是指夹角等于0˚或180˚;小于0时,两向量前后顺序为顺时针顺序(在180˚之内)。
转自:http://www.csie.ntnu.edu.tw/~u91029/VectorProduct.html
另外可参考:如何判断一个点是否在三角形内http://blog.csdn.net/xueyong1203/archive/2007/01/05/1474474.aspx
分享到:
相关推荐
内积(inner product, scalar product,dot product) 根据翻译,内积又叫标量积、点积,还叫数量积。是指接受在实数R上的两个向量并返回一个实数值标量的二元运算。它是欧几里得空间的标准内积。 两个向量和的点积...
3. **向量内积与外积**:内积(点积)和外积是线性代数中的基本概念。在R中,`crossprod()`计算两个向量的内积,而`tcrossprod()`计算外积。内积返回一个标量,外积返回一个矩阵。例如`z1 = crossprod(x, y)`。 4. ...
4. 向量的内积与外积: - 内积:向量的内积可通过`%*%`操作符实现,例如`x %*% y`。另外,`crossprod()`函数也是内积运算的另一种形式,如`crossprod(x, y)`。 - 外积:外积可以用`%o%`操作符完成,例如`x %o% y`...
- **向量的内积与外积** - **内积**:使用`%*%`运算符或`crossprod()`函数,如`x %*% y`计算两个向量的内积。 - **外积**:使用`%o%`运算符,如`x %o% y`计算两个向量的外积。`outer()`函数可以更灵活地计算外积...
C++线性代数运算库。包含了矩阵的加法运算、减法运算、内积运算、外积运算等。 C++线性代数运算库。包含了矩阵的加法运算、减法运算、内积运算、外积运算等.zip
C++线性代数运算库。包含了矩阵的加法运算、减法运算、内积运算、外积运算等。 C++线性代数运算库。包含了矩阵的加法运算、减法运算、内积运算、外积运算等.zip
3. 向量的内积与外积:内积(点积)定义了向量间的数量关系,外积(叉积)在三维空间中形成一个新的向量,具有正交性和右手定则特性。 4. 向量的线性组合与基:任何向量都可以表示为一组基向量的线性组合,基向量是...
2. **向量与空间**:向量的概念、向量的线性组合、向量的内积与外积、向量空间的基本性质、基与维数、子空间等。 3. **线性变换与坐标变换**:理解线性映射和线性变换,掌握坐标变换的计算,例如旋转、平移、缩放等...
2. **向量的内积与外积**:内积(点积)定义了两个向量之间的几何关系,结果是一个标量,表示两个向量的长度与夹角的余弦值。外积(叉积)在三维空间中定义,结果是一个新的向量,其方向垂直于原向量所在平面,长度...
5. **向量与矩阵的内积与外积**:内积使用`%*%`运算符,如`a=t(x)%*%y`,外积可以使用`crossprod()`或`outer()`函数,如`b=crossprod(x,y)`,`f=outer(x,y)`。 6. **二分法求解非线性方程**:自定义函数`fzero()`...
5. **向量和矩阵的内积与外积**:向量的点积和外积在很多领域都有应用,例如在物理学中描述力的作用。 6. **优化算法**:在处理大规模问题时,高效的算法是必不可少的,比如高斯消元法、迭代法等。 7. **线性系统...
2. **内积与外积**:两个向量的点积(内积)如`[1 1 1]*[1;1;1]`,矩阵乘法得到外积如`[1;1;1]*[1 1 1]`。 3. **矩阵索引**:用`(行,列)`访问矩阵元素,如`A(1,:)`获取第一行的所有值。 4. **替换元素**:`A(x,:)=[ ...
- **向量的内积与外积**:衡量向量之间的关系,外积产生一个新的向量或标量。 3. **概率论与数理统计**: - **随机变量**:可以取到不同数值的变量,可以是离散型或连续型。 - **概率分布**:描述随机变量取值...
2. **线性代数**:线性方程组的解法、矩阵的运算(加法、乘法、逆矩阵、行列式、特征值与特征向量)、线性空间、线性变换、欧几里得空间的概念以及向量的内积与外积。这些基础知识在解决几何问题、物理学问题等方面...
重则成百上千行的代码反复尝试多次不知道错在哪里,浪费大量不必要的时间,我也是经常遇到向量以及矩阵的运算,一次搞清楚事后不复习又忘记,然后再查再忘,今天就索性自己写一篇博客,将常见的内积和外积的代数运算...
当 OPERATOR 应用于向量 A 的元素和向量 B 的元素的所有组合时,计算结果矩阵,例如 A 和 B 的外积是 outerop(A,B,'*'),A 和 B 的外和是外操作(A,B,'+') 如果省略 OPERATOR,则假定为“+” 这个函数相当于APL...
同时,该记录仪还具备数据记录功能,可以存储一定时间内的流量数据,便于后期分析和报表生成。 在实际应用中,SPR10F流量积算记录仪可能需要连接到PLC(可编程逻辑控制器)、DCS(分布式控制系统)或其他上位机系统...
"向量的点积与叉积" 向量的点积(数量积)是两个向量的乘积,记为 a · b 或(a,b),它是一个标量值。点积也称为“点积”、“内积”。点积的定义为:a · b = |a| |b| cosθ,其中θ是两个向量之间的夹角。 点积...
本文首先用坐标法定义了向量的内积外积,然后证明了坐标法定义与向量法定义等价。这样做简化了内积外积各种运算规律的证明。
3. **点积法**(Cross Product Method):通过计算点与多边形相邻边的向量的点积,判断点所在平面一侧。如果点总在所有边的同一侧,那么点在多边形内部。 4. **Barycentric坐标法**:将多边形视为平面直角坐标系下...