今天调试BNC用到了newmat库,发现理解不来,向量点积和叉乘以,特别从网上收集资料,准备编写函数库。
1.向量点积(Dot Product)
向量点积的结果有什么意义?事实上,向量的点积结果跟两个向量之间的角度有关。
2.向量叉积(Cross Product)
两个向量a,b,它们的叉积表示为axb,这个很容易跟数学中两个数字之间的相乘,但是这里是完全不同的。
两个向量叉积在图形坐标中就很直观了,axb同时垂直与a和b。
我们很容易验证axb是否同时垂直a和b向量。根据向量乘积的知识,我们只需要计算下axb分别和a,b向量的乘积是否等于0。根据下面的计算确实等于0,这也可以用来验证我们平时向量叉积是否正确的方法。
文章源地址:http://www.waitingfy.com/?p=320
3.点积和叉积的代码实现。
- 内积和叉积的定义
为了形式的简单,我们在C++中以*
表示内积,以^
表示叉积,分别对二者进行运算符重载:
具体实现可参考使用。
double operator*(const Vec& x, const Vec& y)
{
assert(x.size() == y.size()); // #include <cassert>
double sum = 0.;
for (size_t i = 0; i < x.size(); ++i)
sum += x[i]*y[i];
return sum;
}
// 三维的情况
Vec operator^(const Vec& x, const Vec& y)
{
assert(x.size() == y.size() && x.size() == 3);
return Vec{x[1]*y[2]-x[2]*y[1],
x[2]*y[0]-x[0]*y[2],
x[0]*y[1]-x[1]*y[0]};
// uniform initialization, C++11新特性
}
// 二维就姑且返回其模长吧
double twoDCrossProd(const Vec& x, const Vec& y)
{
return x[0]*y[1]-x[1]*y[0];