首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

请问:四维或者更高维向量的叉乘定义

2012-03-06 
请教:四维或者更高维向量的叉乘定义叉乘的集合意义是已知道N维空间中的N-1个基向,可以求出与这N-1个基向量

请教:四维或者更高维向量的叉乘定义
叉乘的集合意义是已知道N维空间中的N-1个基向,可以求出与这N-1个基向量正交的另一个基向量吧. 
有的书上说叉乘只在3维上有定义,就是vec1和vec2相乘得: 
(vec1.y * vec2.z - vec1.z * vec2.y, 
vec1.z * vec2.x - vec1.x * vec2.z, 
vec1.x * vec2.y - vec1.y * vec2.x ) 
其实(我觉得)如果是2维的话那就是一个向量,求它的垂直向量就是叉乘了. 
4维向量的叉乘应该是3个向量相乘.按照某些网上的说法来说是这样定义的: 
V1 x V2 x V3 = 
  |i. j. k. l.| 
  |x1 y1 z1 w1| 
  |x2 y2 z2 w2| 
  |x3 y3 z3 w3| 
其中i,j,k,l是4维空间中的4个基向量. 
但我通过程序代码实现后发现测试不对.叉乘我是这么写的: 
inline Vector4 Vector_Util::cross_product(const Vector4& vec1, const Vector4& vec2, const Vector4& vec3) 

  /* 
  V1 x V2 x V3 = 
  |i. j. k. l.| 
  |x1 y1 z1 w1| 
  |x2 y2 z2 w2| 
  |x3 y3 z3 w3| 
  */ 

  Real a = vec1.x*vec2.y - vec1.y*vec2.x; 
  Real b = vec1.x*vec2.z - vec1.z*vec2.x; 
  Real c = vec1.x*vec2.w - vec1.w*vec2.x; 
  Real d = vec1.y*vec2.z - vec1.z*vec2.y; 
  Real e = vec1.y*vec2.w - vec1.w*vec2.y; 
  Real f = vec1.z*vec2.w - vec1.w*vec2.z; 

  return Vector4( f*vec3.y - e*vec3.z + d*vec3.w, 
  f*vec3.x + c*vec3.z - b*vec3.w, 
  e*vec3.x - c*vec3.y + a*vec3.w, 
  d*vec3.x + b*vec3.y - a*vec3.z); 


测试是随便找了3个不共面的向量比如: 
(1,2,3,4)(-4,-2,3,1)(10,-8,6,5) 
应该叉乘得到的向量始终是和这3个向量垂直的,也就是说和它们分别做点乘应该都是得到0.但为什么算出来老是不对么? 

(1,2,3,4)(-4,-2,3,1)(10,-8,6,5)这3个做叉集算出来是 
72,-63,266,-36 
这个,着实不知道怎么回事了  


[解决办法]
return Vector4( f*vec3.y - e*vec3.z + d*vec3.w,
f*vec3.x + c*vec3.z - b*vec3.w,
e*vec3.x - c*vec3.y + a*vec3.w,
d*vec3.x + b*vec3.y - a*vec3.z);
第二个和第四个是不是前面少了个负号?
[解决办法]
matlab 符号运算作出来的答案
w =
 
[ l, m, n, h]
[ 1, 2, 3, 4]
[ -4, -2, 3, 1]
[ 10, -8, 6, 5]
 
>> det(w)
 
ans =
 
72*l+117*m+266*n-276*h

即结果是(72,117,266,-276),你的第一个和第三个都对,就第二个和第四个不对,应该是你漏了前面的那个负号

热点排行