点积和叉积

Python3.8

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

1、向量的点积

数量积又称标量积(Scalar product)、点积(Dot product),在欧几里得空间(Euclidean space)中称为内积(Inner product),对应元素相乘相加,结果是一个标量(即一个数)。
在这里插入图片描述

在这里插入图片描述

示例:
在这里插入图片描述
在numpy中 使用np.dot或numpy.inner()实现向量的点积

import numpy as np 
a = np.array([1,2,3])
b = np.array([4,5,6])

## 数量积  使用np.dot或np.inner
print(np.dot(a,b))

大家对点积比较熟悉,物理中功的定义就是力和位移的点积,功是个标量:

在这里插入图片描述
在这里插入图片描述

对于两个向量:

在这里插入图片描述

在这里插入图片描述
,点积
在这里插入图片描述

其中最后一个等号为爱因斯坦求和记号(Einstein summation notation),用于简化sigma表达。

2、向量的叉积

叉积,也称向量积,又称矢量积(Vector product)、叉积(Cross product)、外积(Outer product),结果是一个向量。

叉积是两个向量在三维欧氏空间中的二元操作,但叉积仅限于三维空间,对于其他维度的空间,则要使用外积,因此,不严谨的,可将叉积视为外积在三维空间中的特殊情况(有点瑕疵)。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

示例:
在这里插入图片描述
numpy中 使用np.cross实现向量的叉积


import numpy as np 

a = np.array([1,2,3])
b = np.array([4,5,6])

## 叉积  使用np.cross
print(np.cross(a,b))

对于两个向量在这里插入图片描述
其中:
在这里插入图片描述分别表示两个向量的模长,
在这里插入图片描述 表示两个向量在其构建的平面中的夹角,

在这里插入图片描述是单位向量,垂直于这两个向量所张成的平面,方向可用下图的右手定则确定。

显然,叉积不满足交换律,而满足反交换律:

在这里插入图片描述

,即向量交换后,结果向量方向相反,不信伸出您的右手,比划下:

在这里插入图片描述
当两个向量平行时,两者夹角为0度,sine等于0,叉积也为0,几何上,共线的两个向量无法张成一个平行四边形;线性代数的角度,这两个向量线性相关了,无法张成(span)平面。显然,任何向量自叉乘为0:
在这里插入图片描述

当两个向量垂直时,它们夹角为90度,sine为1,叉乘达到最大值 :在这里插入图片描述
在这里插入图片描述

3、矩阵的点积

对于A 矩阵(m × s 阶),B 矩阵(s × n阶)(A的列数与B的行数相等),
在这里插入图片描述
两者的点积,即矩阵相乘的结果C = A B 是m × n 阶矩阵,

在这里插入图片描述
示例:
在这里插入图片描述

numpy实现


import numpy as np 

A1 = np.array([[1,2],[3,4]])
B1 = np.array([[5,6],[7,8]])
A2 = np.array([[1,2,3],[1,2,3]])
B2 = np.array([1,2,3])

## 数量积  使用np.dot
print(np.dot(A1,B1))
print(np.dot(A2,B2))

此外,numpyt提供了numpy.inner()函数,从字面意思理解是内积,其针对向量numpy.inner()与numpy.dot()输出一致,但针对矩阵有所不同。

print(np.inner(A1,B1))

在这里插入图片描述

print(np.inner(A2,B2))

在这里插入图片描述

4、矩阵的叉积

针对矩阵并不存在叉积的概念,numpy中针对矩阵的叉积运算是按照向量的叉积进行运算。

示例:
在这里插入图片描述

numpy实现

import numpy as np 

A1 = np.array([[1,2],[3,4]])
B1 = np.array([[5,6],[7,8]])
A2 = np.array([[1,2,3],[1,2,3]])
B2 = np.array([1,2,3])

## 叉积  使用np.cross
print(np.cross(A1,B1))
print(np.cross(A2,B2))

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

### 向量的定义 向量(内或数量)是指两个向量通过特定运算得到的一个标量值。其代数定义为 \( a \cdot b = |a||b|\cos\theta \),其中 \( \theta \) 是两向量之间的夹角[^2]。 另一方面,向量(外或向量)的结果是一个新的向量,该向量的方向垂直于原两向量所在的平面,而其大小由公式 \( |a \times b| = |a||b|\sin\theta \) 给定[^3]。 ### 计算方法 #### 计算 对于给定向量 \( a = (a_1, a_2, ..., a_n) \) \( b = (b_1, b_2, ..., b_n) \),它们的可按如下方式计算: \[ a \cdot b = a_1b_1 + a_2b_2 + ... + a_nb_n \] 此外,当采用矩阵形式表达时,也可视为一个行向量与其对应列向量相乘的结果[^2]。 ```python import numpy as np # 示例代码展示如何计算 vector_a = np.array([1, 2, 3]) vector_b = np.array([4, 5, 6]) dot_product = np.dot(vector_a, vector_b) print(dot_product) # 输出应为 32 ``` #### 计算 设三维空间中的向量 \( a = (a_x, a_y, a_z) \), \( b = (b_x, b_y, b_z) \),则可通过行列式展开求得: \[ a \times b = ((a_yb_z - a_zb_y)i - (a_xb_z - a_zb_x)j + (a_xb_y - a_yb_x)k) \] 这里 i,j,k 分别代表标准正交基底方向上的单位向量[^4]。 ```python # 示例代码展示如何计算 cross_product = np.cross(vector_a, vector_b) print(cross_product) # 结果取决于输入的具体数值 ``` ### 应用场景 - **的应用** - 测量投影:用于判断一个物体相对于另一物体现在的位置关系。 - 物理学中功的计算:力F作用下位移s所做的功W=F·S。 - **的应用** - 面计算:利用平行四边形面等于两边构成的向量模长这一特性。 - 力矩计算:扭矩τ=r×F,在刚体转动分析中有重要作用。 - 法线确定:在计算机图形学里用来构建表面法向量以便光照效果渲染[^3]。
<think>我们正在用通俗易懂的方式解释在UE材质渲染中的用法。根据之前的讨论,用于计算角度相关效果(如光照强度),用于生成新向量(如法线)。我们将结合引用材料中的实际应用场景进行说明。 引用说明: [^1]提到PBR渲染的六个理论基础,其中微平面理论菲涅尔效应会用到。 [^2]中的灰球铬球用于观察光照,在这里可帮助判断光源方向。 [^3]提到法线贴图生成,在此过程中用于构建切线空间。 [^4]给出PBR渲染的代码片段,其中(NdotL, NdotV)直接用于光照计算。 [^5]描述聚光灯属性,可用于计算光线衰减。 通俗化策略: 1. 用生活比喻:像"投影仪"(测量两个向量的对齐程度),像"指南针"(生成垂直方向)。 2. 聚焦UE具体功能:直接关联到材质编辑器的节常见效果(如边缘光、法线贴图)。 具体回答结构: 1. :比喻为"向量相亲指数"(角度越小越亲密,值越大),举例UE中的光照菲涅尔效应。 2. :比喻为"向量生子"(生成垂直于父母的新向量),举例UE中的法线计算几何校正。 </think> ### 通俗解释在UE材质渲染中的用法 #### 1. **:光线的"相亲指数"** 想象两个向量在"相亲": - **值 = 1**:完全看对眼(两向量同向),光照最强 💡 ![同向](https://via.placeholder.com/150x80?text=N·L=1+亮) - **值 = 0**:互不理睬(两向量垂直),无光照 ![垂直](https://via.placeholder.com/150x80?text=N·L=0+暗) - **值 = -1**:互相讨厌(两向量反向),背光面 **UE中的实际应用**: 1. **光照强度计算**(如手电筒照墙壁[^5]): ```数学 亮度 = 表面法线(N) · 光线方向(L) ``` 法线朝光则亮,背光则暗(灰球验证光照方向[^2]) 2. **边缘发光效果**(如剑刃蓝光): ```数学 边缘光强度 = 1 - (视线方向(V) · 表面法线(N)) ``` 视线与表面平行时最亮(菲涅尔效应[^1]) 3. **阴影软化**:值在0~1之间渐变,实现聚光灯内外锥角的自然过渡[^5] --- #### 2. **:表面的"方向生成器"** 想象用两根筷子确定一个平面: - **结果** = 垂直于筷子的新向量(好比竖起一根新筷子) ![示意](https://via.placeholder.com/150x100?text=T×B=N) - **方向规则**:右手定则(食指→A, 中指→B, 拇指→结果) **UE中的实际应用**: 1. **生成法线贴图**(让砖墙看起来凹凸不平): ```数学 表面法线(N) = 切线(T) × 副切线(B) ``` 通过计算每个像素的"朝向"[^3] 2. **修复模型穿帮**(如地面阴影漂浮): 当模型UV错误时,用重新计算正确法线方向[^3] 3. **粒子运动方向**(如雪花飘落): 用确定粒子旋转轴,实现动态模糊效果 --- ### 一句话总结 - **是"量角器"** → 算亮度/阴影($N·L$值越大越亮) - **是"方向仪"** → 定表面朝向($T×B$生成垂直法线) 在UE材质编辑器中,它们藏在 **`DotProduct`节** **`CrossProduct`节**里,拖出来连线就能创造真实光影!✨
又称内,是向量空间中向量的一种二元运算,其运算结果是一个标量。设向量 $\vec a(x_1,x_2,x_3,...)$,$\vec b(y_1,y_2,y_3,...)$,的计算式为 $\vec a\cdot \vec b=x_1y_1+x_2y_2+x_3y_3+...$,也可用矩阵表示为 $\vec a\cdot \vec b= \begin{pmatrix} x_1\\ x_2\\ x_3\\ \vdots \end{pmatrix}* \begin{pmatrix} y_1 & y_2 & y_3 & \cdots \end{pmatrix}$ [^4]。没有方向的概念。 又称外、矢乘,是向量空间中向量的一种二元运算,其运算结果是一个向量。两个向量 $\vec v$ $\vec w$ 的 $\vec v \times \vec w$ 与这两个向量垂直,其长度为 $\left| \overrightarrow{v} \times \overrightarrow{w} \right| = \left| v \right| \left| w \right| \sin {\theta}$,其中 $\theta$ 为两向量的夹角。的方向采用右手螺旋定则确定,即 $\vec v$ 到 $\vec w$ 的方向是右手四指弯曲的方向,大拇指的方向就是的方向 [^2]。 在代码中,可通过如下方式定义向量以及向量的运算符重载来进行相关计算: ```cpp struct Point { double x,y; Point(double x=0,double y=0):x(x),y(y) {} }; typedef Point Vector; Vector operator + (Vector A,Vector B) { return Vector(A.x+B.x,A.y+B.y); } Vector operator - (Vector A,Vector B) { return Vector(A.x-B.x,A.y-B.y); } Vector operator * (Vector A,double p) { return Vector(A.x*p,A.y*p); } Vector operator / (Vector A,double p) { return Vector(A.x/p,A.y/p); } bool operator < (const Point& a,const Point& b) { return a.x<b.x || (a.x==b.x && a.y<b.y); } int dcmp(double x) { if(fabs(x)<esp) return 0; else return x<0?-1:1; } bool operator == (const Point& a,const Point& b) { return dcmp(a.x-b.x) == 0 && dcmp(a.y-b.y)==0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Adunn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值