精华内容
下载资源
问答
  • 点乘 千次阅读
    2018-11-17 10:07:01

                                                                                 软件架构师何志丹

    含义及证明

    向量OA和向量OB的点乘。以O为原点建立直角坐标系,令A的坐标为(x1,y1),B的坐标为(x2,y2)。

    则点乘的代数含义为:x1x2+y1y2。

    几何含义为:|OA||OB|cos<AOB

    通过几何含义证明代数含义:

    通过余弦定理和几何含义,可以得出:

    点乘=(OA^2+OB^2-AB^2)/2

    =(x1^2+y1^2+x2^2+y2^2-(x1-x2)^2-(y1-y2)^2)/2

    =(x1^2+y1^2+x2^2+y2^2-(x1^2-2x1x2+x2^2)-(y1^2-2y1y2+y2^2))/2

    =(2x1x2+2y1y2)/2

    =x1x2+y1*y2

    物理应用

    功等于 力和位移的点乘

    更多相关内容
  • Matlab 高维矩阵与向量的点乘 (Permute) 今天遇到一个问题,如何用一个n维的向量点乘一个m×k×nm\times k\times nm×k×n 的矩阵, 并避免用循环。Matlab矩阵实验室名不虚传,通过permute这个命令可以有效解决这...
  • 今天小编就为大家分享一篇pytorch点乘与叉乘示例讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 在深入分析混合结构乘法器并在FPGA上实现经典椭圆曲线点乘算法基础上,设计与实现了一种基于NAF编码混合结构乘法器思想的椭圆曲线点乘算法。对实现的点乘算法进行仿真测试和性能评估表明,新设计实现的基于混合结构...
  • Tensorflow二维、三维、四维矩阵运算(矩阵相乘,点乘,行/列累加) 1. 矩阵相乘 根据矩阵相乘的匹配原则,左乘矩阵的列数要等于右乘矩阵的行数。 在多维(三维、四维)矩阵的相乘中,需要最后两维满足匹配原则。 ...
  • matlab代码中向量的点乘 Python程式设计作业 该存储库包含Andrew Ng教授教的编程作业的python版本。 这也许是最受欢迎的在线机器学习入门课程。 除了受欢迎之外,它还是任何有兴趣的学生可以上的最好的机器学习课程...
  • matlab代码中向量的点乘矩阵代数编程语言(MAPL) 马亚圭斯波多黎各大学 我介绍 当前,有几种编程语言能够并且很好地实现了与线性代数方法的结合,其中最大的参与者是MATLAB,R和Python。 R被广泛用于统计计算和图形...
  • 文中针对含有噪声的图像,提出了一种分段点乘的图像分割算法。具体方法是首先根据灰度直方图确定图像的多灰度区域,然后实施分段点乘运算,使得图像中暗的部分更暗、亮的部分更亮,提高了目标和背景的对比度,突显了...
  • matlab代码中向量的点乘 Python程式设计作业 该存储库包含Andrew Ng教授教的编程作业的python版本。 这也许是最受欢迎的在线机器学习入门课程。 除了受欢迎之外,它还是任何有兴趣的学生可以上的最好的机器学习课程...
  • matlab代码中向量的点乘描述 朗多是一个局域网瓜哥与非盟tomatic分化d ynamical系统。 Landau是图灵不完整的静态类型特定于域的可区分语言。 图灵不完整性提供了复杂的源代码分析能力,并因此提供了高度优化的编译...
  • matlab代码中向量的点乘适用于现代Fortran(ttb)的Tensor工具箱 商业FEM软件包为自定义定义的用户资料(例如UMAT中的HYPELA2)提供了接口(用Fortran编写的用户子例程)。 与其他科学编程语言(例如MATLAB或Python...
  • matlab代码中向量的点乘Python¶Python是一种高级的,动态类型化的多范例编程语言。 Python代码通常被称为几乎类似于伪代码,因为它使您可以在很少的代码行中表达非常强大的思想,同时又易于阅读。 例如,这是经典的...
  • matlab代码中向量的点乘 Python程式设计作业 该存储库包含Andrew Ng教授教的编程作业的python版本。 这也许是最受欢迎的在线机器学习入门课程。 除了受欢迎之外,它还是任何有兴趣的学生可以上的最好的机器学习课程...
  • matlab代码中向量的点乘茱莉亚全集 学习笔记 安装 在此下载合适的软件包。 按照说明安装Julia。 IJulia是一种Julia语言后端,结合了交互式环境(也被所使用)。 这种组合使您可以使用Jupyter / IPython的强大功能与...
  • matlab代码中向量的点乘 Python程式设计作业 该存储库包含Andrew Ng教授教的编程作业的python版本。 这也许是最受欢迎的在线机器学习入门课程。 除了受欢迎之外,它还是任何有兴趣的学生可以上的最好的机器学习课程...
  • ECC点乘verilog硬件实现

    2017-12-15 18:42:40
    实现了ECC点乘,二进制伽罗瓦域,顶层点乘算法模块使用了一篇论文中介绍的高速点乘运算
  • 蒙哥马利梯子点乘.pdf

    2020-08-01 11:10:52
    蒙哥马利梯子点乘算法。[k]P:椭圆曲线上点P的k倍点,即:[k]P = {P+P+……+P},k个P相加,即点乘。其中k是正整数。
  • matlab代码中向量的点乘 Python程式设计作业 该存储库包含Andrew Ng教授教的编程作业的python版本。 这也许是最受欢迎的在线机器学习入门课程。 除了受欢迎之外,它还是任何有兴趣的学生可以上的最好的机器学习课程...
  • matlab代码中向量的点乘 Stata 新命令:matmh——扩展版的矩阵运算命令 作者:王美庭 Email: 更新记录 2020年7月2日:解决了 matmh rown A = "2020-07-02" "2020-08-04"无法运行的情况。 摘要 本文主要介绍了个人...
  • 转换乘法为平方运算, 是一种快速计算椭圆曲线密码点乘的代数方法。利用此方法, 提出了素域Fp上雅可比坐标系下的3P和3kP算法, 其运算量分别为6[M] 10[S]和6k[M] 10k[S], 与已有的最好算法相比, 算法效率分别...
  • matlab代码中向量的点乘## MATLAB CHEAT SHEET ###适用于需要将MATLAB代码转换为“常规”代码的开发人员。 长度 返回矩阵或向量中的行数 ###### MATLAB示例 n = length(matrixA); 行汇总 返回一个包含每一行之和的...
  • 提出一种新大数模幂与点乘m_ary算法中窗口大小的最优化估计方法。该方法不同于传统的暴力搜寻方法,也不同于在窗口的取值范围内通过逐一测试程序来获得最优窗口大小的方法。其基于以下理论分析:模幂 m_ary算法的...
  • 简单的cuda程序,包含了矩阵-矢量乘积,矢量-矢量点积的计算,主要用于说明cuda的使用和一些特性,并与intel mkl库的结果进行了比较。
  • 基于网络并行计算,提出椭圆曲线公钥密码体制点乘运算在网络并行环境中实现的算法,详细分析了并行环境中的装箱问题,建立了并行子任务分派的数学模型,并对模型的采用贪心策略的FirstFit算法就行求解,解决了网络...
  • python 的点乘

    千次阅读 2020-11-29 13:35:56
    文章目录 矩阵乘法,星乘(*)和点乘(.dot)的区别1. 基本示例2. 总结python实现余弦相似度java实现余弦相似度矩阵乘法,星乘(*)和点乘(.dot)的区别1. 基本示例import numpya = numpy.array(, ])b = numpy.array......

    o55g08d9dv.jpg广告关闭

    腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元!

    文章目录 矩阵乘法,星乘(*)和点乘(.dot)的区别1. 基本示例2. 总结python实现余弦相似度java实现余弦相似度矩阵乘法,星乘(*)和点乘(.dot)的区别1. 基本示例import numpya = numpy.array(, ])b = numpy.array...

    点乘:点乘的结果是一个实数 a·b=|a|·|b|·cosx x为a,b的夹角 结果为数,且为标量 例: a=,b= a·b=a1b1+a2b2+a3b3叉乘(向量积):当向量a和b不平行的时候其模的大小为 |a×b|=|a|·|b|·sinx(实际上是ab所构成的平行四边形的面积) 方向为 a×b和a,b都垂直 且a,b,a×b成右手系当a和b平行的时候,结果为0向量 叉...

    oe9wltcbqw.png

    点乘:点乘的结果是一个实数 a·b=|a|·|b|·cosx x为a,b的夹角 结果为数,且为标量 例: a=,b= a·b=a1b1+a2b2+a3b3差乘:当向量a和b不平行的时候其模的大小为 |a×b|=|a|·|b|·sinx(实际上是ab所构成的平行四边形的面积) 方向为 a×b和a,b都垂直 且a,b,a×b成右手系当a和b平行的时候,结果为0向量 叉乘结果为...

    qzpb59gbk7.png

    线性代数矩阵乘法:使用dot函数而不是 *,使用 * 得到的结果等于是matlab中使用点乘. * 的结果,使用dot函数才是真正的矩阵乘法。 矩阵求逆、矩阵分解、行列式:函数名同matlab,使用前要先导入:from numpy.linalg import inv, qr 等等,以此类推。 一些常用的线代函数 ? 随机数的生成这里着重说一下randn和normal...

    return vector(k*self.x, k*self.y, k*self.z)数量积数量积在数学上叫做点积,这个点位于中间位置(·),并不是英文句号的那个点,在 python 中并没有这个符号,这可能有些难办了,只不过不要太失望,python 还是能够让你办到! 我们在学 numpy 矩阵的时候矩阵点乘矩阵可以调用 dot 方法,也可以通过@运算符来实现...

    线性代数矩阵乘法:使用dot函数而不是 *,使用 * 得到的结果等于是matlab中使用点乘. * 的结果,使用dot函数才是真正的矩阵乘法。 矩阵求逆、矩阵分解、行列式:函数名同matlab,使用前要先导入:from numpy.linalg import inv, qr 等等,以此类推。 一些常用的线代函数 ? 随机数的生成这里着重说一下randn和normal...

    好久不用python,努力捡起来ing----python3语法字符串repr()把其他类型变量转换为字符串ord()把单个字符转换为相应的ascii码int()把其他进制的“字符串”转换为十进制int(str,n),其中str是字符串,n是进制,eg:int(1101,2)13from numpy import *和importnumpy的区别前者是引入numpy包中的所有类,后续代码中可以...

    (2, 3)数组作为矩阵d = b.reshape((3,2))#点乘等操作c = a.dot(d)print(c)切片与索引import numpy as npa =np.random.random((2,3,4))print(a)print(a)...标记plt.plot(x,y,color=r,linestyle=--,marker=o)plt.show() python 中的多线程#线程import timeimport threadingdef music(name,loop): for i in range...

    4dnki4m5jy.jpg

    dtype=int)print(b) ]print(b)23print(b)print(b)print(b) ]print(b)2.dota =np.array(,])b = np.array(,])c = a * b # 元素点乘输出:array(, ])d = a.dot(b) # 矩阵乘法输出:array(, ])e = np.dot(a,b) # 矩阵乘法输出:array(, ]) dsfsdf 参考文章:python中的矩阵、多维数组----numpy...

    矩阵点乘矩阵对应元素相乘a1=mat(); a2=mat(); a3=multiply(a1,a2); 123矩阵点乘a1=mat(); a2=a1*2; 123.矩阵求逆,转置 矩阵求逆a1=mat(eye(2,2)*0.5); a...python的numpy库提供矩阵运算的功能,因此我们在需要矩阵运算的时候,需要导入numpy的包。 1.numpy的导入和使用from numpy import *; #导入numpy的库函数...

    gr9de9b8ba.gif

    矩阵点乘矩阵对应元素相乘>>>a1=mat(); a2=mat(); a3=multiply(a1,a2)>>> a3matrix(])矩阵点乘>>>a1=mat(); a2=a1*2>>>a2matrix(])3. 矩阵求逆,转置 矩阵...1.numpy的导入和使用from numpy import *; #导入numpy的库函数import numpy as np; #这个方式使用numpy的函数时,需要以np.开头。 2.矩阵的创建由一维或...

    矩阵乘法(点乘)矩阵乘法必须满足矩阵乘法的条件,即第一个矩阵的列数等于第二个矩阵的行数。 矩阵乘法的函数为 dot 例如import numpy as npa1 = np.array(,]) # a1为2*3矩阵a2= np.array(,]) # a2为3*2矩阵print(a1.shape==a2.shape) # true,满足矩阵乘法条件print(a1.dot(a2))# a1.dot(a2)相当于matlab中的a1*a2#...

    矩阵点乘矩阵对应元素相乘a1=mat(); a2=mat(); a3=multiply(a1,a2); 矩阵点乘a1=mat(); a2=a1*2; 3.矩阵求逆,转置 矩阵求逆a1=mat(eye(2,2)*0.5); a2=a1...python的numpy库提供矩阵运算的功能,因此我们在需要矩阵运算的时候,需要导入numpy的包。 1.numpy的导入和使用from numpy import *; #导入numpy的库函数...

    array()原始矩阵可以由svd的输出用np.dot点乘重新组合得到:in :sarr = np.diag(spec)in : svd_mat = uarr.dot(sarr).dot(vharr)in :np.allclose(svd_mat...scipy可以与其它标准科学计算程序库进行比较,比如gsl(gnu c或c++科学计算库),或者matlab工具箱。 scipy是python中科学计算程序的核心包; 它用于有效地...

    python进行矩阵运算的方法:1、矩阵相乘 a1=mat(); a2=mat(,]); a3=a1*a2 #1*2的矩阵乘以2*1的矩阵,得到1*1的矩阵 a3matrix(])2、矩阵对应元素相乘 a1=mat(); a2=mat(); a3=multiply(a1,a2) a3matrix(])multiply()函数:数组和矩阵对应位置相乘,输出与相乘数组矩阵的大小一致3、矩阵点乘 a1=mat(); a2=a1*2 a2...

    rlfmwyaxdp.jpeg

    returnmath.sqrt(squared_distance(v,w))####### define sum_of_squares### 向量的点乘defdot(v,w):returnsum(v_i*w_iforv_i,w_iinzip(v,w))### 向量的平房和defsum_of_squares(v):v_1*v_1+v_2*v_2+... +v_n*v_nreturndot(v,v)# classifierdefknn_classify(k,labeled_points,new_point):each labeled point should be...

    5uwc7luq3z.jpeg

    temp = x1**(i-j)*(x2**j) #矩阵直接乘相当于matlab中的点乘. *out = np.hstack((out, temp.reshape(-1,1)))returnout6、使用scipy的优化方法梯度下降使用...github.comlawlite19machinelearning_pythontreemasterlinearregressionhttps:github.comlawlite19machinelearning_pythonblobmasterlinearregression...

    tb9ssm570a.png

    mt = m print(m.t )# ] # 计算矩阵的内积 xtx print(numpy.dot(m,m.t))# numpy.dot点乘 # 高维数组的轴对象 k =numpy.arange(8).reshape(2,2,2) print(k )# ,],]] print(k) # 轴变换 transpose 参数:由轴编号组成的元组 m = k.transpose((1,0,2)) # m = k print(m )# ,],]] print(m) # 轴交换 swapaxes (axes:轴)...

    fizakem7v2.jpeg

    首先matrix中乘号*表示矩阵的叉乘,而点乘需要使用multiply函数,这点更接近于matlab。 其次刚才没有提到array的求逆之类的操作,因为array经常需要多一步...且由于是从笔记上摘回,所以可能会有些混乱。 一. 安装 numpy是一个python用于数值计算的库,这个库由于提供了许多科学计算的函数,强大的矩阵处理能力和...

    余弦相似度a与b表示向量(x1,y1),(x2,y2)分子为a与b的点乘,分母为二者各自的l2相乘,即将所有维度值的平方相加后开方。 ? 说明:a.经过step2,得到k个新...则就打印(或绘制)簇以及质心四.python实现+代码详解以下是python得实例代码以及代码的详解,应该可以理解的。 import randomimport pandas as pdimport ...

    展开全文
  • 主要介绍了matlab中乘法“*”和点乘“.*”;除法“/”和点除“./”的联系和区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • 点乘&叉乘

    2022-02-25 18:57:10
    在游戏开发中,确定目标的方位,朝向,夹角等相关数据需要用到向量间的计算,其中最常用到的就是点乘和叉乘。 说实话,因为向量的运算在平时开发中不是经常使用,我也总弄混这两种运算的含义,所以这次好好区分一下...

    在游戏开发中,确定目标的方位,朝向,夹角等相关数据需要用到向量间的计算,其中最常用到的就是点乘和叉乘。

    说实话,因为向量的运算在平时开发中不是经常使用,我也总弄混这两种运算的含义,所以这次好好区分一下,也给有同样困扰的朋友一点小小的帮助。

    因为我们主要研究的是游戏开发中的3D世界向量,所以下面的介绍会以几何定义为主,不研究其代数定义。

    1.点乘

    定义

    又称点积、数量积、标量积。

    从几何角度看,点乘是两个向量的长度和它们的夹角余弦值的积。

    从名称和定义上来看,点乘的结果是标量。

    点乘的名称也源自于点乘的运算符号。

    通过上面的公式,我们还可以得到如下公式。

    也就是说如果给定了两个向量,那么我们就可以求出两个向量的夹角。

    关于这里的计算需要插播一个点,当两个单位向量的长度都是1的时候,向量的点乘就是他们夹角的余弦值。在游戏开发中会有归一化的操作,然后直接求夹角的情况,如果对这个知识点没有了解,可能看不懂夹角计算的原理。

    我们通过点积公式可以看出来a,b都是标量,都是正数,余弦值会根据角度有正负变化。

    当(0-90)°的时候,余弦值是正数,整个点乘公式都是正的。

    当90°的时候,余弦值为0,整个公式为0。

    当(90-180)°的时候,余弦值是负数,整个公式为负的。

    利用这个性质,我们可以根据点乘的正负,做一些判断了。

    在Unity中的应用

    下面会直接用代码解释如何使用Unity提供的数学库进行点乘相关运算

    using UnityEngine;
    
    public class Example : MonoBehaviour
    {
    	// 红色方块为敌人
    	// 蓝色方块为自身
    	public Transform cubeRed;
    	public Transform cubeBlue;
    
    	private void Update()
    	{
    		if (Input.GetKeyDown(KeyCode.Space))
    		{
    			CalculateDot();
    		}
    	}
    
    	private void CalculateDot()
    	{
    		// 先计算出敌人想对自身的位置信息
    		// 再使用自身正方向与相对方向两个向量做点乘的相关运算
    		Vector3 relativePosition = cubeRed.position - cubeBlue.position;
    		Vector3 cubeForward = cubeBlue.forward;
    
    		// 计算两个向量的点乘
    		// 如果大于0说明敌人在自身前面
    		// 如果小于0说明敌人在自身后面
    		// 如果等于0说明敌人在自身左右
    		float result = Vector3.Dot(cubeForward, relativePosition);
    		Debug.Log("点积的结果:" + result);
    		
    		// 得到两个向量后,可以直接计算其夹角
    		float angle = Vector3.Angle(cubeForward, relativePosition);
    		Debug.Log("两个向量的夹角:" + angle);
    
    		// 这是前面说到的当两个向量的长度都为1时,点乘的结果就是夹角的余弦值
    		float cos = Vector3.Dot(cubeForward.normalized, relativePosition.normalized);
    		Debug.Log("余弦值:" + cos);
    
    		// 通过反余弦函数得到两个向量的角度
    		// 不过这里得到是弧度值,并不是角度值
    		float radians = Mathf.Acos(cos);
    		Debug.Log("通过余弦值求弧度:" + radians);
    
    		// 弧度值通过数据库转换成角度值
    		angle = radians * Mathf.Rad2Deg;
    		Debug.Log("把弧度转换成角度:" + angle);
    	}
    }
    

    得到的结果如图所示,当敌人在自身后方时,点乘的结果小于0,当敌人在自身前方时,点乘的结果大于0。

    2.叉乘

    定义

    又称叉积、向量积

    首先叉乘的结果是向量不是标量。

    叉乘的名称也来源于符号

    叉乘的公式定义稍微复杂一点。

    叉乘最后的结果是一个向量,大小可以根据公式算出,但是方向要根据右手法则确定。

    实际上Unity中用的是左手坐标系,所以确定方向的时候我们要用左手法则,最后得到的方向正好与右手法则相反。所以两个向量的叉乘并不是一个真向量,它受参照系的影响,这个在以后的计算中要注意我们使用的到底是哪种坐标系。

    Unity官方API文档

    几何意义

    如果以向量a和b为边构成一个平行四边形,那么这两个向量的叉乘的模长与这个平行四边形的面积相等。

    其实这个概念很好理解。我们不考虑叉乘方向的问题,叉乘的模长就是a*b*sinθ,其实也就是平行四边形面积公式中的底乘高。

    在Unity中的应用

        private void CalculateCross()
        {
            Vector3 relativePosition = cubeRed.position - cubeBlue.position;
            Vector3 cubeForward = cubeBlue.forward;
            Vector3 result = Vector3.Cross(cubeForward, relativePosition);
            Debug.Log(result.y);
        }
    

    根据左手定则,y轴是法向量的方向,当y大于零的时候,敌人在我方右边,当y小于零的时候,敌人在我方左边。

    在实际开发中,我们可以用叉乘来判断最优转向角,根据敌人的方位,判断我们应该向什么方向是最快的。

    简单来说,在两个物体的位置关系判断中。

    点乘可以判断出目标物体在我的前方还是后方。大于零在前方,小于零在后方。

    叉乘可以判断出目标物体在我的左边还是右边。大于零在右方,小于零在左方。

    在计算机图形学中。

    点乘可以用来计算夹角余弦值。

    叉乘可以用来计算平面法向量。

    展开全文
  • 好久没有写文章了,抱歉了,以后每天...两个向量“相乘”:等于两个向量的模(长度)乘于夹角的余弦在二维空间中,向量的点乘:使用余弦定理证明:向量点乘的直观理解:向量的点乘,两个向量必须是同方向的,所以做...

    好久没有写文章了,抱歉了,以后每天都会更新一篇的....

    向量的点乘,也就是两个向量相乘:

    我们是不这么定义的,不是两个向量对应的坐标元素相乘:

    两个向量“相乘”,结果是⼀个数!,两个向量"相乘",更严格的说法:两个向量的点乘,两个向量的内积。

    两个向量“相乘”:等于两个向量的模(长度)乘于夹角的余弦

    在二维空间中,向量的点乘:

    使用余弦定理证明:

    向量点乘的直观理解:

    向量的点乘,两个向量必须是同方向的,所以做投影以后的长度再相乘

    同样,可以用坐标来理解:

    v向量分解为x轴的x2向量,y轴的y2向量,u向量分解为x轴的x1向量,和y轴的y1向量,然后分别相乘,有4种情况,垂直的向量相乘为0,所以是x1.x2+y1.y2

    使用Python实现向量的点乘:

    具体代码:

    定义一个内部使用的文件_globals,用来存储全局使用的变量 EPSILON,用来判断精度用的

    EPSILON = 1e-8

    Vector的代码:

    import math

    from ._globals import EPSILON

    class Vector:

    def __init__(self, lst):

    self._values = list(lst)

    @classmethod

    def zero(cls, dim):

    """返回一个dim维的零向量"""

    return cls([0] * dim)

    def __add__(self, another):

    """向量加法,返回结果向量"""

    assert len(self) == len(another), \

    "Error in adding. Length of vectors must be same."

    return Vector([a + b for a, b in zip(self, another)])

    def __sub__(self, another):

    """向量减法,返回结果向量"""

    assert len(self) == len(another), \

    "Error in subtracting. Length of vectors must be same."

    return Vector([a - b for a, b in zip(self, another)])

    def norm(self):

    """返回向量的模"""

    return math.sqrt(sum(e**2 for e in self))

    def normalize(self):

    """返回向量的单位向量"""

    if self.norm() < EPSILON:

    raise ZeroDivisionError("Normalize error! norm is zero.")

    return Vector(self._values) / self.norm()

    def dot(self, another):

    """向量点乘,返回结果标量"""

    assert len(self) == len(another), \

    "Error in dot product. Length of vectors must be same."

    return sum(a * b for a, b in zip(self, another))

    def __mul__(self, k):

    """返回数量乘法的结果向量:self * k"""

    return Vector([k * e for e in self])

    def __rmul__(self, k):

    """返回数量乘法的结果向量:k * self"""

    return self * k

    def __truediv__(self, k):

    """返回数量除法的结果向量:self / k"""

    return (1 / k) * self

    def __pos__(self):

    """返回向量取正的结果向量"""

    return 1 * self

    def __neg__(self):

    """返回向量取负的结果向量"""

    return -1 * self

    def __iter__(self):

    """返回向量的迭代器"""

    return self._values.__iter__()

    def __getitem__(self, index):

    """取向量的第index个元素"""

    return self._values[index]

    def __len__(self):

    """返回向量长度(有多少个元素)"""

    return len(self._values)

    def __repr__(self):

    return "Vector({})".format(self._values)

    def __str__(self):

    return "({})".format(", ".join(str(e) for e in self._values))

    测试代码:

    from playLA.Vector import Vector

    if __name__ == "__main__":

    vec = Vector([5, 2])

    print(vec)

    print("len(vec) = {}".format(len(vec)))

    print("vec[0] = {}, vec[1] = {}".format(vec[0], vec[1]))

    vec2 = Vector([3, 1])

    print("{} + {} = {}".format(vec, vec2, vec + vec2))

    print("{} - {} = {}".format(vec, vec2, vec - vec2))

    print("{} * {} = {}".format(vec, 3, vec * 3))

    print("{} * {} = {}".format(3, vec, 3 * vec))

    print("+{} = {}".format(vec, +vec))

    print("-{} = {}".format(vec, -vec))

    zero2 = Vector.zero(2)

    print(zero2)

    print("{} + {} = {}".format(vec, zero2, vec + zero2))

    print("norm({}) = {}".format(vec, vec.norm()))

    print("norm({}) = {}".format(vec2, vec2.norm()))

    print("norm({}) = {}".format(zero2, zero2.norm()))

    print("normalize {} is {}".format(vec, vec.normalize()))

    print(vec.normalize().norm())

    print("normalize {} is {}".format(vec2, vec2.normalize()))

    print(vec2.normalize().norm())

    try:

    zero2.normalize()

    except ZeroDivisionError:

    print("Cannot normalize zero vector {}.".format(zero2))

    print(vec.dot(vec2))

    注意:

    向量的点乘的应⽤

    1、求出两个向量之间的夹角范围,或者具体值

    2、判断两个向量的相似程度(推荐系统)

    一组物品进行推荐,可能是电影,音乐....在推荐的时候,最典型的推荐策略就是推荐和你的喜好最相似的内容,比如说,你已经在系统上留下足迹,喜欢电影A,此时电影B和A相似,推荐系统就会倾向把电影B推荐给你,电影C和电影B极其不相似,推荐系统就不会推荐。

    在这个背后如何判断两个电影是否相似?

    很简单的判断就是使用向量的点乘,在这种情况下,可以想象一下,每一个电影都可以理解为一个高维空间中的点,把向量另外一种视角看待(高维空间中的一个点),对电影来说,它可能有(电影的时间,演员的列表,电影的导演,电影的类型,电影的色调,台词量....)的一个高维度信息,就是在一个高维空间中的点,在这种情况下,如果我们转换我们的视角,把每个电影又转换成一个高维空间中的一个向量,每两个电影之间就会存在一个夹角,这时候,我们可以看这两个电影之间的夹角是直角,钝角,还是锐角,,如果是锐角,那么这两个电影之间有一部分是重合的,我就说这两个电影是相似的,如果是垂直的,那么这两部电影就是无关的,如果是顿角那么这两部电影是背离的。

    在这里我们不仅可以看两个向量之间的夹角,还可以看点乘的结果(值),如果点乘的值为正值,并且越大,说明这两个电影越相似,在最极端的情况下,这两个向量完全重合的时候,那么这时候这两个向量的点乘将达到最大值,也就是两个电影的高维空间中的点(电影的时间,演员的列表,电影的导演,电影的类型,电影的色调,台词量....)已经重合了。

    换句话说,我们可以使用向量点乘的方式,来看两个向量(电影)的相似,值越大,越相似,值越小,越不一样,这就是向量的点乘在推荐系统中的一个典型应用,当然了,现在的推荐

    系统都比较复杂,在判断两个物品是否相似的时候,也有其他更加准确的方法,不仅如此,在具体判断两个物品是否相似之前,对两个物品所对应的数据也也需要进行很多的处理。

    3、⼏何计算

    v向量投影到u向量上

    投影点的方向,也就是u向量除以u向量的模,也就是u向量方向的单位向量,举例子,u向量为(3,4),模长为5,u向量方向的单位向量为(3/5,4/5)

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 28,551
精华内容 11,420
关键字:

点乘