0x00 向量


向量 ( vector ) 是一种兼具大小 ( magnitude ) 和方向的量。

0x01 几何表示


几何方法中用一条有向线段来表示一个向量,其中,线段长度代表向量的模,箭头的指向代表向量的方向。

改变向量的位置不会改变其大小和方向,所以向量与其位置无关。当我们说两个向量相等,当且仅当它们的长度相等且方向相同。

0x02 数学表示


数学中使用坐标系来描述向量,通过平移操作将向量的尾部移动到原点,就可以通过坐标来确定该向量。

每当我们根据坐标来确定一个向量时,其对应的坐标总是相对于某一参考系而言的。

标量和向量都可以用坐标 (x, y, z) 来表示。但它们的意义截然不同:点仅表示位置,而向量表示大小与方向。

0x03 向量的基本运算


设有向量 \(u = (u_x, u_y, y_z)\) 和 \(v = (v_x, v_y, v_z)\):

  1. 两个向量相等,当且仅当它们对应的分量分别相等。
  2. 向量加法:\(u + v = (u_x + v_x, u_y + v_y, u_z + v_z)\)。
  3. 标量乘法 ( scalar multiplication ),设 k 是一个标量,则 \(ku = (ku_x, ku_y, ku_z)\)。
  4. 向量减法:\(u - v = (u_x - v_x, u_y - v_y, u_z - v_z)\)。
  5. \((0, 0, 0)\) 称为零向量 (zero-vector),可简记为 0。

0x04 向量的长度和单位向量


向量的大小(即模)的几何意义是对应有向线段的擦汗高难度,用双竖线表示(如 \(||u||\))。

代数计算方法:\(\|u\| = \sqrt{x^2 + y^2 + z^2}\)

规范化 (normalizing) :

将向量的长度变为单位长度,将向量的每个分量分别除以该向量的模:\(\hat{u} = \frac{u}{\|u\|} = (\frac{x}{\|u\|},\frac{y}{\|u\|}\frac{z}{\|u\|})\)。

规范化又称标准化、归一化、正常化、规格化、正态化、单位化……不必拘泥于名词译法。

0x05 点积


点积 ( dot product ,也称为数量积或内积 ) 是一种计算结果为标量值的向量乘法运算,因此也称标量积 ( scalar product )。设 \(u = (u_x, u_y, y_z)\) 和 \(v = (v_x, v_y, v_z)\),则点积的定义为:\(u \cdot v = u_xv_x + u_yv_y + u_zv_z\)

点积的几何意义是:\(u \cdot v = \|u\| \|v\| \cos{\theta}\)

点积的一些几何性质:

  1. \(u \cdot v = 0\),那么 \(u \perp v\) (即两个向量正交)。
  2. \(u \cdot v \gt 0\),那么两向量之间的夹角 θ 小于 90°(即两向量间的夹角为一锐角)。
  3. \(u \cdot v \lt 0\),那么两向量之间的夹角 θ 大于 90°(即两向量间的夹角为一钝角)。

正交 (orthogonal)与垂直(perendicular)为同义词。

0x06 正交


给出向量 v 和单位向量 n,用点积公式求出 p。

因为 n 是单位向量,所以:\(p = (\|v\| \cos{\theta}) n = (v \cdot n)n\)。我们称 p 为向量 v 落在向量 n 上的正交投影(orhogonal projection),通常将它表示为:\(p = proj_n(v)\)。

如果 n 不具有单位长度,就先对它进行规划法处理,使之成为单位向量。可以得到更一般的投影公式:\(p = proj_n(v) = (v \cdot \frac{n}{\|n\|}) \frac{n}{\|n\|} = \frac{(v \cdot n)}{\|n\|^2}n\)。

如果向量集合中每个向量都是相互正交且皆具单位长度,我们就称此集合是规范正交(orhonormal)的。

有一种常见的工作,将非规范正交集正交化。

1.2D 正交化处理

假设有一个向量集合 \(\{v_0, v_1\}\),现在要将它正交化为 \(\{w_0, w_1\}\)。首先设 \(w_0=v_0\),通过使 \(v_1\) 减去它在 \(w_0\) 上的分量来令它正交于 \(w_0\):\(w_1 = v_1 - proj_{w_0}(v_1)\)。

此时我们就得到一个元素相互正交的向量集合 \(\{w_0, w_1\}\);最后将其中的元素规范化为单位向量即可。

2.3D 正交化处理

与 2D 的处理方式类似,只不过要多一些步骤。

3.格拉姆-施密特正交化(Gram-Schmidt Orthogonalization)

对于具有 n 个向量的一般集合 \(\{ v_0, ..., v_{n-1}\}\) 来说,基本步骤:

设 \(w_0 = v_0\),对于 \(1 \le i \le n - 1\),令 \(w_i=v_i - \sum_{j=0}^{i-1}proj_{w_j}(v_i)\)。

规范化步骤:令 \(w_i=\frac{w_i}{\|w_i\|}\)

将给定集合内的向量 \(v_i\) 添加到规范正交集中时,需要令 \(v_i\) 减去它在现有规范正交集中的其他向量方向上的分量,这样可以确保新加入规范正交集的向量与该集合中的其他向量相互正交。

0x07 叉积


假设 3D 向量 u 与 v 的叉积为 w,则 w 与向量 u、v 彼此正交。

\(w = u \times v = (u_yv_z - u_zv_y, u_zv_x - u_xv_z, u_xv_y - u_yv_x)\)

通过叉积来进行正交化

流程如下:

  1. 令 \(w_0 = \frac{v_0}{\|v_0\|}\)。
  2. 令 \(w_2 = \frac{w_0 \times v_1}{\|w_0 \times v_1\|}\)。
  3. 令 \(w_1 = w_2 \times w_0\)。

此时,向量集 \(\{ w_0, w_1, w_2 \}\) 是规范正交的。

DX12龙书 01 - 向量在几何学和数学中的表示以及运算定义的更多相关文章

  1. DX12龙书第6章习题

    1. { { , DXGI_FORMAT_R32G32B32_FLOAT, , , D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, }, { , DXGI_FO ...

  2. DX12龙书 02 - DirectXMath 库中与向量有关的类和函数

    0x00 需要用到的头文件 #include <DirectXMath> #include <DirectXPackedVector.h> using namespace Di ...

  3. DX12龙书 00 - 环境配置:通过 Visual Studio 2019 运行示例项目

    0x00 安装 Visual Studio 2019 安装 Visual Studio 2019 以及相关组件. 注:安装组件时带的 Windows 10 SDK 可以在 Individual com ...

  4. 正则表达式引擎的构建——基于编译原理DFA(龙书第三章)——3 计算4个函数

    整个引擎代码在github上,地址为:https://github.com/sun2043430/RegularExpression_Engine.git nullable, firstpos, la ...

  5. [HLSL]HLSL 入门参考 (dx11龙书附录B译文)

    原文:[HLSL]HLSL 入门参考 (dx11龙书附录B译文) HLSL 高级着色语言 参考文档 龙书DirectX12现已推出中文版,其附录B的高级着色器语言参考的翻译质量比本文更高,有条件的读者 ...

  6. 龙书(Dragon book) +鲸书(Whale book)+虎书(Tiger book)

    1.龙书(Dragon book)书名是Compilers: Principles,Techniques,and Tools作者是:Alfred V.Aho,Ravi Sethi,Jeffrey D. ...

  7. 编译原理 #03# 龙书中缀转后缀JS实现版

    // 来自龙书第2章2.5小节-简单表达式的翻译器 笔记 既然是语法制导翻译(Syntax-directed translation),那么最重要的东西当然是描述该语言语法的文法,以下为中缀表达式文法 ...

  8. Directx11学习笔记【八】 龙书D3DApp的实现

    原文:Directx11学习笔记[八] 龙书D3DApp的实现 directx11龙书中的初始化程序D3DApp跟我们上次写的初始化程序大体一致,只是包含了计时器的内容,而且使用了深度模板缓冲. D3 ...

  9. 线性代数的本质与几何意义 01. 向量是什么?(3blue1brown 咪博士 图文注解版)

    向量是线性代数最基础.最基本的概念之一,要深入理解线性代数的本质,首先就要搞清楚向量到底是什么? 向量之所以让人迷糊,是因为我们在物理.数学,以及计算机等许多地方都见过它,但又没有彻底弄懂,以至于似是 ...

随机推荐

  1. JVM学习第三天(JVM的执行子系统)之类加载机制补充

    昨晚没看完,今天继续 系统的类加载器 对于任意一个类,都需要由加载它的类加载器和这个类本身一同确立其在Java虚拟机中的唯一性,每一个类加载器,都拥有一个独立的类名称空间.这句话可以表达得更通俗一些: ...

  2. 20191002思维导图工具MindManager 000 033

  3. [Java数据结构]Map的contiansKey和List的contains比较

    Map的containskey方法使用哈希算法查找key是否存在,运算时间是常数: List的contains方法是将元素在列表中遍历,运算时间和列表长度有关. 我使用两种不同SQL语句获取两种不同类 ...

  4. ArrayList源码剖析与代码实测

    ArrayList源码剖析与代码实测(基于OpenJdk14) 目录 ArrayList源码剖析与代码实测(基于OpenJdk14) 继承关系 从构造函数开始 从add方法深入 / 数组的扩容 其他的 ...

  5. 本机ping不通虚拟机,但虚拟机可以ping通本机时怎么解决

    在各自网络都连接的情况下,本机ping不通虚拟机,但虚拟机可以ping通本机时解决方案: 1.linux虚拟机中连接方式选择NAT模式 2.本地启动VMnet8,然后选择VMnet8的属性,手动输入和 ...

  6. 详解usbmon抓取的log各字段的含义

    详解 usbmon 抓取的 log 各字段的含义 在上篇文章中,我们已经介绍了如何在 linux 下使用 usbmon 抓取 usb 总线上数据的方法.(https://www.cnblogs.com ...

  7. [LeetCode]301. 删除无效的括号(DFS)

    题目 题解 step1. 遍历一遍,维护left.right计数器,分别记录不合法的左括号.右括号数量. 判断不合法的方法? left维护未匹配左括号数量(增,减)(当left为0遇到右括号,则交由r ...

  8. [程序员代码面试指南]递归和动态规划-机器人达到指定位置方法数(一维DP待做)(DP)

    题目描述 一行N个位置1到N,机器人初始位置M,机器人可以往左/右走(只能在位置范围内),规定机器人必须走K步,最终到位置P.输入这四个参数,输出机器人可以走的方法数. 解题思路 DP 方法一:时间复 ...

  9. [Binder深入学习二]Binder驱动——基础数据结构二

    Userspace和KernelSpace进行交互时,大部分命令是通过 ioctl 实现的,在这个过程中,最重要的一个便是 BINDER_WRITE_READ 命令了. #define BINDER_ ...

  10. 对比 Redis 中 RDB 和 AOF 持久化

    概念 Redis 是内存数据库,数据存储在内存中,一旦服务器进程退出,数据就丢失了,所以 Redis 需要想办法将存储在内存中的数据持久化到磁盘. Redis 提供了两种持久化功能: RDB (Red ...