/*
* 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
自己编写的线性代数库之向量
最新推荐文章于 2024-04-20 16:58:12 发布