请教:四维或者更高维向量的叉乘定义
叉乘的集合意义是已知道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),你的第一个和第三个都对,就第二个和第四个不对,应该是你漏了前面的那个负号