向量点积(Dot Product)与向量叉积(Cross Product)

今天调试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];

猜你喜欢

转载自blog.csdn.net/m0_37362454/article/details/81095528