在三维空间中,两个向量的乘积(向量积,外积,乘积,区别于两个向量的数乘:内积,点积)表示两个向量的扭矩,而三个向量的混合积A×B·C,则表示由三个向量A,B,C所构成的平行六面体的面积。而且在混合积中A,B,C的位置是可以互换的(这个很容易证明),这也符合我们的经验。那么问题来了?
1)3个或者N>3个三维向量相乘如何定义?A×B×C×D....因为A×B是有定义的,A×B是向量,那么只要继续乘就可以了,这也说明3维向量相乘,向量个数不是问题;
2)向量个数不是问题,那4维向量的两个向量相乘呢?

设A=(a1,a2,a3,a4),B=(b1,b2,b3,b4) A*B=(x1,x2,x3,x4)则满足如下方程组:
 ① A·(A*B)=0
 ② B·(A*B)=0
 ③ |A*B|=|A|*|B|sinθ。
这是一个4元二次方程组,但只有3个方程组,显然解不是一个。这说明A*B在4维空间,如果按垂直来定义,无法唯一确定,其结果是一个面(受限的)。
类似的,扩展到n维空间,方程组还是只有3个。结果是n-2维体(面)(受限于方程)。

下面推广n维向量的
n-1个向量积:A1*A2*...A(n-1)·;
混合积:A1*A2*...A(n-1)·An.

/// <summary>/// 向量积/// </summary>/// <param name="A"></param>/// <param name="B"></param>/// <returns></returns>public static TVector Mul(TVector A, TVector B){if (A.Count == B.Count && B.Count == 3){var theI = A[1] * B[2] - A[2] * B[1];var theJ = -(A[0] * B[2] - A[2] * B[0]);var theK = A[0] * B[1] - A[1] * B[0];TVector theV = new TVector(theI, theJ, theK);return theV;}else{throw new Exception("现仅支持3分量.");}}/// <summary>/// n维向量的n-1个向量的乘积,n>3/// </summary>/// <param name="Vectors">向量组</param>/// <returns></returns>public static TVector Mul2(params TVector[] Vectors){if (Vectors==null || Vectors.Length < 2){throw new Exception("参数错误必须是n维向量n-1个向量模式");}var theN = Vectors[0].Count;if (theN != Vectors.Length + 1){throw new Exception("参数错误必须是n维向量n-1个向量模式");}var theA = new double[theN, theN];for (int i = 0; i < theN; i++){theA[0, i] = 1; }for (int i = 0; i < theN; i++){for (int j = 0; j < Vectors.Length; j++){theA[j + 1, i] = Vectors[j][i];}}//按第一行展开求代数余子式,并计算行列式.(1,j)的代数余子式就是所求向量第j个分量的值.var theRetA = new double[theN];for (int j = 0; j < theN; j++){var theA1 = LinearAlgebra.GetDeterminantMij(theA, 1, j + 1);var theSign = LinearAlgebra.CalcDeterMijSign(1, j + 1);theRetA[j] = theSign * LinearAlgebra.CalcDeterminant(theA1);}return new TVector(theRetA);}/// <summary>/// n维向量的n个向量的混合积A1×A2.....An-1·An/// </summary>/// <param name="Vectors">向量组</param>/// <returns></returns>public static double Mul3(params TVector[] Vectors){if (Vectors == null || Vectors.Length < 2){throw new Exception("参数错误必须是n维向量n-1个向量模式");}var theN = Vectors[0].Count;if (theN != Vectors.Length){throw new Exception("参数错误必须是n维向量n个向量模式");}var theA = new double[theN, theN];for (int i = 0; i < theN; i++){for (int j = 0; j < Vectors.Length; j++){theA[j, i] = Vectors[j][i];}}return LinearAlgebra.CalcDeterminant(theA);}/// <summary>/// 向量混合积A×B·C/// </summary>/// <param name="A"></param>/// <param name="B"></param>/// <returns></returns>public static double Mul(TVector A, TVector B, TVector C){if (A.Count == B.Count && B.Count == 3){double[,] theA = new double[3, 3];for (int i = 0; i < 2; i++){theA[0, i] = A[i];theA[1, i] = B[i];theA[2, i] = C[i];}return LinearAlgebra.CalcDeterminantAij(theA);}else{throw new Exception("现仅支持3分量.");}}
暂时研究到此,后面有时间继续研究。
注意:算法中用到的函数参见Mymathlib系列.
后记:N维空间中(N>3)的两个向量相乘,如果按照三维空间中的向量积的定义方式,往往得不到唯一的积向量,对于大于三维的空间,不好获得直观的看法。我们不换假设在平面上有一条线A,另一条线B与之垂直,如果B的模确定,则B是确定的,但如果是三维空间,则满足与A垂直且模一定的线段,就不止一条了,而是一个圆。那么在4维空间中,对于A*B,满足向量积定义的向量也不是唯一的。


n维向量积(3维向量积的推广,向量算法)相关推荐

  1. 解决softmax后列和不为1的bug记录 :问题原因为 s为1维的,来除torch.exp(x)(64x10)时候,维数不对应,需要将s也要转换为2维的即维数为(64x1),才可以广播按行对应相除

    def softmax(x):     ## TODO: Implement the softmax function here     #print("torch.exp(x)=" ...

  2. 【C 语言】二级指针作为输入 ( 二维数组 | 二维数组遍历 | 二维数组排序 )

    文章目录 一.二维数组 1.二维数组声明及初始化 2.二维数组遍历 3.二维数组排序 二.完整代码示例 一.二维数组 前几篇博客中 , 介绍的是指针数组 ; 指针数组 的 结构特征 是 , 数组中的每 ...

  3. 【商务智能】数据仓库 ( 多维数据模型 | 多维数据分析 )

    商务智能系列文章目录 [商务智能]数据预处理 [商务智能]数据仓库 ( 多维数据模型 | 多维数据分析 ) 文章目录 商务智能系列文章目录 前言 一.数据仓库 与 传统数据库 区别 二.数据仓库系统体 ...

  4. 【DBMS 数据库管理系统】OLAP 核心技术 : 多维数据模型 ( 多维数据模型 | 维 | 维成员 | 维层 | 维层次 | 维属性 | 度量 )

    文章目录 一.OLAP 核心技术 二.OLAP 多维数据模型 三.OLAP 多维数据模型 核心概念 四.维 五.维成员 六.维层 七.维层次 八.维属性 九.度量 一.OLAP 核心技术 OLAP 核 ...

  5. 【C 语言】指针 与 数组 ( 指针 | 数组 | 指针运算 | 数组访问方式 | 字符串 | 指针数组 | 数组指针 | 多维数组 | 多维指针 | 数组参数 | 函数指针 | 复杂指针解读)

    相关文章链接 : 1.[嵌入式开发]C语言 指针数组 多维数组 2.[嵌入式开发]C语言 命令行参数 函数指针 gdb调试 3.[嵌入式开发]C语言 结构体相关 的 函数 指针 数组 4.[嵌入式开发 ...

  6. php 二位数组随机,PHP多维数组 php打乱数组二维数组多维数组的简单实例

    php中的shuffle函数只能打乱一维数组,有什么办法快速便捷的打乱多维数组?手册上提供了 上面这个是针对二维数组的! 下面针对多维数组的乱序方法?尽可能的方便快速: 以下函数也是出自php手册,可 ...

  7. Java数组(3)--二维(多维)数组

    二维数组相当于一维数组的元素是一维数组 一.二维数组声明赋值初始化 动态初始化① int[][] arr = new int[3][2]; 定义了名称为arr的二维数组 二维数组中有3个一维数组 每一 ...

  8. 二维数组 类型_Java第六章 | 二维数组的创建及使用、数组排序算法

    二维数组的创建及使用 1.二维数组的创建 2.二维数组初始化 3.使用二维数组 二维数组的创建 声明二维数组的方法有两种,语法如下所示: 数组元素类型 数组名字[ ][ ]; 数组元素类型[ ][ ] ...

  9. 从1维到6维,一文读懂多维数据可视化策略

    本文经机器之心(微信公众号:almosthuman2014)授权转载,禁止二次转载 选自towardsdatascience 作者:Dipanjan Sarkar 参与:Jane W.乾树.黄小天 数 ...

  10. mvc中嵌入ssrs报表_如何在SSRS报表中过滤多维OLAP多维数据集

    mvc中嵌入ssrs报表 Ever since the early days of my career, SQL Server Reporting Services (SSRS) has been o ...

最新文章

  1. 网络瓶颈、线程死锁、内存泄露溢出、栈堆、ajax
  2. ubuntu18 安装python3.8.tgz
  3. quartz+spring框架动态调整频率实践
  4. Hyperopt中文文档:Home
  5. ospf多区域配置为什么ping不通_「实战」动态路由多区域 OSPF 基本配置,一分钟了解下...
  6. python题库刷题训练软件_刷题 -- python计算器练习题
  7. java文件打包jar文件_Java打包成jar文件,以及将jar文件导出为exe文件方法汇总(图形说明)...
  8. TensorFlow2-迁移学习
  9. grub4dos中的不容易理解的问题
  10. C或C 如何通过程序执行shell命令并获取命令执行结果?
  11. Linux用户、用户组、文件权限设置
  12. 浅谈Jfinal急速开发框架
  13. [转载] Python3.0中普通方法、类方法和静态方法的比较
  14. IDEA配置xml文件头报错:URI is not registered (Settings | Languages Frameworks | Schemas and DTDs)解决方法,亲测有效
  15. 太真实了!程序员之间的鄙视链...
  16. php date( ymd_PHP DATE()
  17. java水晶报表pull模式_水晶报表Pull模式 每次调用水晶报表的时候都要输入数据库密码的解决方案...
  18. vue检测是不是360浏览器兼容模式_Vue项目兼容IE11
  19. 安装LaTeX中文字体 xGBKFonts
  20. 计算机毕业设计之java+springboot基于vue的地方废物回收机构管理系统

热门文章

  1. Unity开发OpenXR | (一)OpenXR是什么?一文带你全面了解OpenXR的相关知识,上车收藏不迷路
  2. 6.2排序式检索 词项频率
  3. R语言 | 计算基因表达量 TPM R脚本
  4. Atcoder ARC093F : Dark Horse
  5. Logstash: Grok 模式示例
  6. 蓝桥杯 ALGO-1001 跳马
  7. 一图看懂互联网各职位都是干啥的
  8. 将真分数分解为埃及分数
  9. ACM-ICPC 2016 沈阳赛区现场赛 I. The Elder HDU 5956(斜率DP)
  10. 京东宙斯php版本sdk不能用_一个SDK引发的“血案”