点乘和叉乘及其物理意义(C++STL实现)
一些错误观念的澄清,比如数学意义上的
点积
和叉积
并不对应matlab程序中的.*
(按位相乘)和*
(矩阵乘法)内积的物理意义
- 一种向量到标量的映射
- 两向量的夹角的计算
- 两向量是否正交的判断
- 两向量的相似性(similarity)的度量
叉积的意义
如何使用C++语言(STL容器,运算符重载):
- 表示向量
- 计算内积
- 计算叉积
- 计算模长
- 计算两向量的夹角
- 计算点到直线的距离
prerequisites
内积(inner product)
又叫点乘,点积(dot product),数量积,顾名思义得到的是一个标量(scalar)。
- 代数定义
向量x=[x1,x2,…,xn]x=[x_1, x_2, \ldots, x_n]和y=[y1,y2,…,yn]y=[y_1, y_2, \ldots, y_n]的内积定义为:
x\cdot y=\sum_i^nx_iy_i=x_1y_1+x_2y_2+\dots+x_ny_n
也即:内积等于向量的对应位相乘再相加,如果从函数的观点来看的话,即是两个矢量相互作用得到一个标量。
内积对相互作用的两个向量x,yx,y的长度也即各自所含元素的个数是没有限制的。这点不同于向量叉积,叉积所要的向量长度最高为3.
- 几何定义
欧式空间中,向量是一个同时拥有长度和方向的几何对象。向量xx的长度记为∥x∥\|x\|,两个向量的内积定义为:
x\cdot y=\|x\|\|y\|cos\theta
θ\theta标识着两向量的夹角。可见当向量正交时,θ=90∘\theta = 90^\circ,x⋅y=0x\cdot y = 0。
当向量yy被归一化为长度为1的单位向量时,x⋅y=∥x∥cosθx\cdot y=\|x\|cos\theta,我们来考察x,yx,y均为二维的情形:
如上图所示,此时二者的内积表示的恰是其中一个向另外一个的投影,投影长度越小,说明二者的夹角越大,反之亦然。当两向量同时归一化为1时,此时内积的定义为:x⋅y=cosθx\cdot y = cos\theta,内积越大,说明两者夹角越小,也间接地说明两者也就越相似,故在许多机器学习的算法,常用余弦相似性来度量两特征向量的逼近程度。内积既然能够表征两向量的夹角,自然判断两向量是否正交(值为0)就更不在话下了。
叉积
又叫叉乘(cross product)或者外积,它的计算结果是一个向量而非标量。叉积所在的向量与参与运算的两个向量都正交,也即正交于原来的两个向两边所决定的平面,也即两向量所决定的平面的法向量可通过计算叉积的方式得以确定。当参与运算的两向量是平行的两个向量时,得到的叉积为0,也即可通过计算叉积的方式判断两向量是否平行。
代数定义
- 二维时
x\times y = x_1y_2-x_2y_1
- 三维时
根据如图的计算方法可得:
\begin{eqnarray} \begin{split} \textbf{u}\times \textbf{v}=& \begin{vmatrix} \textbf {i} & \textbf{j} & \textbf{k} \\ u_1 & u_2 & u_3 \\ v_1 & v_2 & v_3 \end{vmatrix}\\ =&(u_2v_3\textbf{i}+u_3v_1\textbf{j}+u_1v_2\textbf{k})-(u_3v_2\textbf{i}+u_1v_3\textbf{j}+u_2v_1\textbf{k})\\ =&(u_2v_3-u_3v_2)\textbf{i}+(u_3v_1-u_1v_3)\textbf{j}+(u_1v_2-u_2v_1)\textbf{k}\\ =&(u_2v_3-u_3v_2, u_3v_1-u_1v_3, u_1v_2-u_2v_1) \end{split} \end{eqnarray}
几何定义
x\times y = \|x\|\|y\|sin\theta \vec{n}
n⃗ \vec{n}表示叉积方向上的单位向量。
中学知识告诉我们三角形的面积计算公式为:
S=\dfrac{\|x\|\|y\|sin\theta}{2}=\dfrac{\|z\|h}{2}
其中 θ\theta表示的是 x,yx, y之间的夹角,由以上两个公式我们可得到 三角形的高
或者 点到其所对的边的距离
,也即点到直线的距离,的计算公式:
h=\|x\times y\|/\|z\|
C++ STL实现
- 向量的定义:
typedef vector<double> Vec;
- 矩阵减法
Vec operator-(const Vec& x, const Vec& y)
{assert(x.size() == y.size());// #include <cassert>Vec tmp;for(size_t i = 0; i < x.size(); ++i)tmp.push_back(x[i] - y[i]);return tmp; // 返回局部变量的拷贝
}
- 内积和叉积的定义
为了形式的简单,我们在C++中以*
表示内积,以^
表示叉积,分别对二者进行运算符重载:
double operator*(const Vec& x, const Vec& y)
{assert(x.size() == y.size()); // #include <cassert>double sum = 0.;for (size_t i = 0; i < x.size(); ++i)sum += x[i]*y[i];return sum;
}// 三维的情况
Vec operator^(const Vec& x, const Vec& y)
{assert(x.size() == y.size() && x.size() == 3);return Vec{x[1]*y[2]-x[2]*y[1], x[2]*y[0]-x[0]*y[2],x[0]*y[1]-x[1]*y[0]};// uniform initialization, C++11新特性
}// 二维就姑且返回其模长吧
double twoDCrossProd(const Vec& x, const Vec& y)
{return x[0]*y[1]-x[1]*y[0];
}
- 模长或者范数的计算
double norm(const Vec& x)
{double val = 0.;for(auto elem: x)val += elem*elem;return sqrt(val); // #include <cmath>
}
- 向量夹角的计算
#define PI 3.14159265358979323846
// 弧长向弧度的转换
double toDegree(double val)
{return val*180/PI;
}double angle(const Vec& x, const Vec& y)
{return toDegree(acos(x*y/norm(x)/norm(y)));// x*y, 计算二者的内积
}
- 点到直线的距离
// x0, x1, x2 分别表示三角形的三个顶点的坐标
// 这里计算的是点x0到x1和x2构成的直线的距离
double distance(const Vec& x0, const Vec& x1, const Vec& x2)
{return twoDCrossProd(x1-x0, x2-x0)/norm(x1-x2);
}
客户端程序:
int main(int, char**)
{Vec x{1, 0, 0}, y{0, 1, 0};Vec z = x^y; // 计算叉乘copy(z.begin(), z.end(), ostream_iterator<double>(cout, " "));cout << endl;// 0 0 1Vec alpha{1, 0}, beta{1, 1};cout << angle(alpha, beta) << endl;// 45Vec x0{0, 0}, x1{1, 0}, x2{0, 1}; cout << distance(x0, x1, x2) << endl;// 1/sqrt(2)return 0;
}
点乘和叉乘及其物理意义(C++STL实现)相关推荐
- 视觉SLAM小知识——叉乘的物理意义
物理意义:两个向量a,b的叉乘仅在三维空间有意义,表示一个与向量a和向量b都垂直的向量,叉乘的模等于以向量a,b为边的平行四边形面积. 向量n是叉乘方向的单位向量,角度为向量a,b的夹角. 当夹角为0 ...
- 内积和外积的物理意义-数学
内积和外积的物理意义 Persistently关注 2018.07.31 14:28:46字数 277阅读 6,276 向量的内积 ab=ab cos(θ) 向量a和b的长度之积再乘以它们之间的夹角的 ...
- 矩阵相关概念的物理意义
参考链接: 矩阵乘法的本质是什么? 条件数 病态矩阵与条件数(&& 与特征值和SVD的关系) 矩阵的物理意义: https://blog.csdn.net/NightkidLi_911 ...
- 奇异值的物理意义是什么?强大的矩阵奇异值分解(SVD)及其应用
作者:郑宁 链接:https://www.zhihu.com/question/22237507/answer/53804902 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请 ...
- 频谱中负频率的物理意义(二)
1.频率的概念就是从机械旋转运动来的,定义为角速度,对于周期运动,角速度也就是角频率.通常 θ以反时针为正,因此转动的正频率是反时针旋转角速度,负频率就是顺时针旋转角速度.这就是它的物理意义,正.负号 ...
- 卷积的定义及其物理意义_高等数学入门——高阶导数的定义及其物理意义
系列简介:这个系列文章讲解高等数学的基础内容,注重学习方法的培养,对初学者不易理解的问题往往会不惜笔墨加以解释.在内容上,以国内的经典教材"同济版高等数学"为蓝本,并对具体内容作了 ...
- 奇异值的物理意义是什么?
作者:知乎用户链接:https://www.zhihu.com/question/22237507/answer/53804902 来源:https://www.zhihu.com/question/ ...
- 图像傅立叶变换的物理意义
原文:http://blog.csdn.net/dadaadao/article/details/6093882 傅立叶变换可以看做拉普拉斯变换的特殊形式.拉氏变换就是将原时域函数乘上一个与 σ相关的 ...
- 【数字信号处理】序列傅里叶变换 ( 傅里叶变换物理意义 | 反应信号在整个数字角频率上的能量分布 )
文章目录 一.傅里叶变换物理意义 一.傅里叶变换物理意义 x(n)x(n)x(n) 序列 的 傅里叶变换 X(ejω)X(e^{j\omega})X(ejω) 的 物理意义 : 傅里叶变换 : 根据 ...
最新文章
- PHP的Smarty
- 10所“双一流”入选!一批国家自然科学基金立项名单公示
- Oral English 1: A topic about public transportaion in Chicago.
- 电子商务(六)-作业题解-第3章
- 递归 算例一(求一个简单嵌套字典的深度)
- crt中 新建的连接存储在哪_LCD发展至今仍然没有完胜CRT显示器,“老玩家”为你现身说法...
- 201771010137 赵栋 《第十二周学习总结》
- TCP的定时器系列 — 零窗口探测定时器(有图有代码有真相!!!)
- codeforces——Little Pony and Sort by Shift
- android 运动目标检测_MindSpore应用案例:AI对篮球运动员目标的检测
- 田园主义创始人发布致歉声明:测算失误导致热量差异
- 通信原理电子版_2021届通信工程专业保研经历分享+个人经验总结
- 操作系统课程设计之磁盘调度系统的设计与实现c语言
- mac上SCRT中文变问号的处理方式,亲测有效
- 英语句子划分表示符号使用规则
- 麒麟操作系统产业化项目落户天津
- java生日祝福程序代码_生日快乐代码
- python效验车辆VIN码小程序
- dual功能计算机,dual是什么意思车上的-功能介绍须知
- win8输入法图标不见了
热门文章
- (转)Managed DirectX +C# 开发(入门篇)(七)
- MFC 教程【6_应用程序的退出 】
- Python 之 变量的基本使用
- HSQL转换成MapReduce过程
- Spark利用(idea+maven+scala)创建wordcount打包jar并在spark on yarn上运行——Spark的开发
- p12解析流程_iOS证书及描述文件制作流程详解
- linux压缩隐藏文件,Linux下查看压缩文件内容的10种方法(小结)
- qq发文件大小上限_微信再两个放大招!网友:QQ可以卸载了?
- C语言解决累加和累乘问题
- 第八届蓝桥杯第二题等差素数列