自己编写的线性代数库之向量

来源:互联网 发布:centos连接无线网 编辑:程序博客网 时间:2024/05/21 21:41
/* * Vector.h * *  Created on: 2013年12月31日 *      Author: 何飞 */#ifndef VECTOR_RAINBOW_H_#define VECTOR_RAINBOW_H_#pragma once#include "stdio.h"#include "math.h"#include "iostream"#include "string"using namespace std;namespace Rainbow/*Rainbow Louis是我的英文名字*/{  template<unsigned int length = 4, typename TElement = float>    class Vector    {    public:      //数据成员      TElement Elements[length];    public:      //构造和析构      Vector(void)      {        //初始各个值都初始化为0        SetValue(0);      }      Vector(TElement value)      {        //初始各个值都初始化为value        SetValue(value);      }      ~Vector(void)      {      }    public:      /***************************************************************************       * 设置元素       **************************************************************************/      void      SetValue(TElement value)      {        //初始各个值都设置为0        for (int i = 0; i < length; i++)          {            this->Elements[i] = value;          }      }    public:      /***************************************************************************       * 加法运算       **************************************************************************/      //自加一个数      void      operator +=(const TElement& num)      {        for (int i = 0; i < length; i++)          {            Elements[i] = Elements[i] + num;          }      }      //数在右边      Vector<length, TElement>      operator +(const TElement& num) const      {        Vector<length, TElement> result = *this;        result += num;        return (result);      }      //数在左边,向量在右边      friend Vector<length, TElement>      operator +(const TElement& num, const Vector<length, TElement>& vec)      {        Vector<length, TElement> result = vec;        result += num;        return (result);      }      //自加一个向量      void      operator +=(const Vector<length, TElement>& vec)      {        for (int i = 0; i < length; i++)          {            Elements[i] = Elements[i] + vec.Elements[i];          }      }      //左右都是向量      friend Vector<length, TElement>      operator +(const Vector<length, TElement>& left,          const Vector<length, TElement>& right)      {        Vector<length, TElement> result = left;        result += right;        return (result);      }    public:      /***************************************************************************       * 乘法运算       **************************************************************************/      //自乘一数      void      operator *=(const TElement& num)      {        for (int i = 0; i < length; i++)          {            Elements[i] = Elements[i] * num;          }      }      //数在右边      Vector<length, TElement>      operator *(const TElement& num) const      {        Vector<length, TElement> result = *this;        result += num;        return (result);      }      //数在左边,向量在右边      friend Vector<length, TElement>      operator *(const TElement& num, const Vector<length, TElement>& vec)      {        Vector<length, TElement> result = vec;        result += num;        return (result);      }      //左右都是向量(向量之间的点乘)      friend TElement      operator *(const Vector<length, TElement>& left,          const Vector<length, TElement>& right)      {        TElement result = 0;        for (int i = 0; i < length; i++)          {            result += (left.Elements[i] * right.Elements[i]);          };        return (result);      }      /***************************************************************************       * 减法运算       **************************************************************************/      //自减1向量      void      operator -=(const Vector<length, TElement>& right)      {        for (int i = 0; i < length; i++)          {            Elements[i] = Elements[i] - right.Elements[i];          };      }      //左右都是向量(对应元素相减)      friend Vector<length, TElement>      operator -(const Vector<length, TElement>& left,          const Vector<length, TElement>& right)      {        Vector<length, TElement> result = left;        result -= right;        return (result);      }    public:      /***************************************************************************       * 求模运算:也就是距离原点的距离       **************************************************************************/      TElement      Norm() const      {        TElement SquareSum = 0;        for (int i = 0; i < length; i++)          {            //1.取得元素            TElement d = Elements[i];            //2.计算元素的平方            TElement Square = d * d;            //3.计算平方和            SquareSum += Square;          };        //最后开放返回        return (sqrt(SquareSum));      }      //向量的单位化      Vector<length, TElement>      Identity() const      {        Vector<length, TElement> result;        //1.先取得长度        TElement L = this->Norm();        //2.求得长度的倒数        TElement L1 = 1 / L;        //3.每个元素都乘以一个系数        return ((*this) * L1);      }    };//输出函数(调试专用)  template<unsigned int length = 4, typename TElement = float>    ostream&    operator<<(ostream& out, const Vector<length, TElement> vector)    {      out << "Vector<" << length << ">" << endl;      for (int i = 0; i < length; i++)        {          out << "\t" << vector.Elements[i] << endl;        }      return (out);    }}#endif


0 0
原创粉丝点击