3d数学基础—用C++实现矩阵的相乘和向理与矩阵的相乘
2015-05-27 14:06
567 查看
//计算向量的模,负向量,零向量,标量与向量的乘法,标准化向量,向量的加法和减法 ,距离公式,点乘,叉乘
#include <iostream.h>
#include <math.h>
class Vector3
{
public:
double x, y, z; //在数学上的表示 [x,y,z] , 这里的我们定义为成员变量
public:
Vector3(){}
Vector3(const Vector3& a) : x(a.x), y(a.y), z(a.z){}
Vector3(double a, double b, double c) : x(a), y(b), z(c){}
void zero() //设置为零向量
{
x = y = z = 0;
}
Vector3 operator-() const //负向量
{
return Vector3(-x, -y, -z);
}
Vector3 operator*(float a) const //标量必须在右边
{
return Vector3(x*a, y*a, z*a);
}
Vector3 operator*=(float a) //标量必须在右边
{
x*=a; y*=a; z*=a;
return *this;
}
Vector3 operator/(float a) const //标量必须在右边
{
float oneOverA = 1.0f/a; //计算机中的除法速度比较慢
return Vector3(x*oneOverA, y*oneOverA, z*oneOverA); //目的是速度快一点
}
Vector3 operator/=(float a) //标量必须在右边
{
float oneOverA = 1.0f/a;
x*=oneOverA; y*=oneOverA; z*=oneOverA;
return *this;
}
//向量的加法,两个向量相加
Vector3 operator+(const Vector3& a) const
{
return Vector3(x+a.x, y+a.y, z+a.z);
}
//向量的减法,两个向量相减
Vector3 operator-(const Vector3& a) const
{
return Vector3(x-a.x, y-a.y, z-a.z);
}
//向量的加法,另一种方式
Vector3 operator+=(const Vector3& a)
{
x+=a.x; y+=a.y; z+=a.z;
return *this;
}
//向量的减法,另一种方式
Vector3 operator-=(const Vector3& a)
{
x-=a.x; y-=a.y; z-=a.z;
return *this;
}
//向量的标准化操作,单位向量
void normalize()
{
float magSq = x*x + y*y + z*z;
if(magSq>0.0f)
{
float oneOverMag = 1.0f/sqrt(magSq);
x *= oneOverMag;
y *= oneOverMag;
z *= oneOverMag;
}
}
//点乘
float operator*(const Vector3& a) const
{
return x*a.x + y*a.y + z*a.z;
}
};
/*
如果将数据定义为私有,需要使用友元
public:
friend Matrix3x3& operator*(const Matrix3x3& a, const Matrix3x3& b);
friend Vector3& operator*(const Vector3&p, const Matrix3x3& m);
friend void print_m(Matrix3x3 m);
//叉乘
friend Vector3 crossProduct(const Vector3& a, const Vector3& b);
friend void print_v(Vector3 v);
friend double vectorMag(const Vector3& a);
friend Vector3 operator*(float k, const Vector3& v); //定义标量的左乘
friend float distance(const Vector3& a, const Vector3& b); //两点之间的距离
*/
double vectorMag(const Vector3& a) //计算模
{
return sqrt(a.x*a.x + a.y*a.y + a.z*a.z);
}
void print_v(Vector3 v)
{
cout<<"["<<v.x<<", "<<v.y<<", "<<v.z<<"]"<<endl;
}
Vector3 operator*(float k, const Vector3& v)
{
return Vector3(k*v.x, k*v.y, k*v.z);
}
float distance(const Vector3& a, const Vector3& b)
{
//float dx = a.x - b.x;
//float dy = a.y - b.y;
//float dz = a.z - b.z;
//return sqrt(dx*dx + dy*dy + dz*dz);
//以上代码可以用一句代替
return vectorMag(a-b);
}
Vector3 crossProduct(const Vector3& a, const Vector3& b)
{
return Vector3
(
a.y*b.z - a.z*b.y,
a.z*b.x - a.x*b.z,
a.x*b.y - a.y*b.x
);
}
//一个3*3的矩阵
class Matrix3x3
{
public:
float m11, m12, m13;
float m21, m22, m23;
float m31, m32, m33;
};
//矩阵*矩阵
Matrix3x3& operator*(const Matrix3x3& a, const Matrix3x3& b)
{
Matrix3x3 r;
r.m11 = a.m11*b.m11 + a.m12*b.m21 + a.m13*b.m31;
r.m12 = a.m11*b.m12 + a.m12*b.m22 + a.m13*b.m32;
r.m13 = a.m11*b.m13 + a.m12*b.m23 + a.m13*b.m33;
r.m21 = a.m21*b.m11 + a.m22*b.m21 + a.m23*b.m31;
r.m22 = a.m21*b.m12 + a.m22*b.m22 + a.m23*b.m32;
r.m23 = a.m21*b.m13 + a.m22*b.m23 + a.m23*b.m33;
r.m31 = a.m31*b.m11 + a.m32*b.m21 + a.m33*b.m31;
r.m32 = a.m31*b.m12 + a.m32*b.m22 + a.m33*b.m32;
r.m33 = a.m31*b.m13 + a.m32*b.m23 + a.m33*b.m33;
return r;
}
//向量*矩阵
Vector3 operator*(const Vector3& p, const Matrix3x3& m)
{
return Vector3(
p.x*m.m11 + p.y*m.m21 + p.z*m.m31,
p.x*m.m12 + p.y*m.m22 + p.z*m.m32,
p.x*m.m13 + p.y*m.m23 + p.z*m.m33
);
}
//矩阵*矩阵的另一种方式
Matrix3x3& operator*=(Matrix3x3& a, const Matrix3x3& b)
{
a = a*b;
return a;
}
//向量*矩阵的另一种方式
Vector3 operator*=(Vector3& p, const Matrix3x3& m)
{
p = p*m;
return p;
}
//输出一个矩阵
void print_m(Matrix3x3 m)
{
cout<<m.m11<<"\t"<<m.m12<<"\t"<<m.m13<<endl;
cout<<m.m21<<"\t"<<m.m22<<"\t"<<m.m23<<endl;
cout<<m.m31<<"\t"<<m.m32<<"\t"<<m.m33<<endl;
}
int main()
{
cout<<"hello, 矩阵!"<<endl;
//定义两个矩阵,使这两个矩阵相乘
Matrix3x3 a, b, c;
a.m11 = 1; a.m12 = -5; a.m13 = 3;
a.m21 = 0; a.m22 = -2; a.m23 = 6;
a.m31 = 7; a.m32 = 2; a.m33 = -4;
//print_m(a);
cout<<endl<<endl;
b.m11 = -8; b.m12 = 6; b.m13 = 1;
b.m21 = 7; b.m22 = 0; b.m23 = -3;
b.m31 = 2; b.m32 = 4; b.m33 = 5;
//print_m(b);
cout<<endl<<endl;
c = a*b; //一个矩阵*另一个矩阵
print_m(c);
a*=b;
print_m(a); //一个矩阵*另一个矩阵的另一种方式
cout<<endl;
//定义一个向量和一个矩阵,使这个向量和这个矩阵相乘
Vector3 v(3,-1,4);
Matrix3x3 m;
m.m11 = -2; m.m12 = 0; m.m13 = 3;
m.m21 = 5; m.m22 = 7; m.m23 = -6;
m.m31 = 1; m.m32 = -4; m.m33 = 2;
Vector3 r;
r = v*m; //一个向量*一个矩阵
print_v(r);
v*=m; //一个向量*一个矩阵的另一种方式
print_v(v);
return 0;
}
#include <iostream.h>
#include <math.h>
class Vector3
{
public:
double x, y, z; //在数学上的表示 [x,y,z] , 这里的我们定义为成员变量
public:
Vector3(){}
Vector3(const Vector3& a) : x(a.x), y(a.y), z(a.z){}
Vector3(double a, double b, double c) : x(a), y(b), z(c){}
void zero() //设置为零向量
{
x = y = z = 0;
}
Vector3 operator-() const //负向量
{
return Vector3(-x, -y, -z);
}
Vector3 operator*(float a) const //标量必须在右边
{
return Vector3(x*a, y*a, z*a);
}
Vector3 operator*=(float a) //标量必须在右边
{
x*=a; y*=a; z*=a;
return *this;
}
Vector3 operator/(float a) const //标量必须在右边
{
float oneOverA = 1.0f/a; //计算机中的除法速度比较慢
return Vector3(x*oneOverA, y*oneOverA, z*oneOverA); //目的是速度快一点
}
Vector3 operator/=(float a) //标量必须在右边
{
float oneOverA = 1.0f/a;
x*=oneOverA; y*=oneOverA; z*=oneOverA;
return *this;
}
//向量的加法,两个向量相加
Vector3 operator+(const Vector3& a) const
{
return Vector3(x+a.x, y+a.y, z+a.z);
}
//向量的减法,两个向量相减
Vector3 operator-(const Vector3& a) const
{
return Vector3(x-a.x, y-a.y, z-a.z);
}
//向量的加法,另一种方式
Vector3 operator+=(const Vector3& a)
{
x+=a.x; y+=a.y; z+=a.z;
return *this;
}
//向量的减法,另一种方式
Vector3 operator-=(const Vector3& a)
{
x-=a.x; y-=a.y; z-=a.z;
return *this;
}
//向量的标准化操作,单位向量
void normalize()
{
float magSq = x*x + y*y + z*z;
if(magSq>0.0f)
{
float oneOverMag = 1.0f/sqrt(magSq);
x *= oneOverMag;
y *= oneOverMag;
z *= oneOverMag;
}
}
//点乘
float operator*(const Vector3& a) const
{
return x*a.x + y*a.y + z*a.z;
}
};
/*
如果将数据定义为私有,需要使用友元
public:
friend Matrix3x3& operator*(const Matrix3x3& a, const Matrix3x3& b);
friend Vector3& operator*(const Vector3&p, const Matrix3x3& m);
friend void print_m(Matrix3x3 m);
//叉乘
friend Vector3 crossProduct(const Vector3& a, const Vector3& b);
friend void print_v(Vector3 v);
friend double vectorMag(const Vector3& a);
friend Vector3 operator*(float k, const Vector3& v); //定义标量的左乘
friend float distance(const Vector3& a, const Vector3& b); //两点之间的距离
*/
double vectorMag(const Vector3& a) //计算模
{
return sqrt(a.x*a.x + a.y*a.y + a.z*a.z);
}
void print_v(Vector3 v)
{
cout<<"["<<v.x<<", "<<v.y<<", "<<v.z<<"]"<<endl;
}
Vector3 operator*(float k, const Vector3& v)
{
return Vector3(k*v.x, k*v.y, k*v.z);
}
float distance(const Vector3& a, const Vector3& b)
{
//float dx = a.x - b.x;
//float dy = a.y - b.y;
//float dz = a.z - b.z;
//return sqrt(dx*dx + dy*dy + dz*dz);
//以上代码可以用一句代替
return vectorMag(a-b);
}
Vector3 crossProduct(const Vector3& a, const Vector3& b)
{
return Vector3
(
a.y*b.z - a.z*b.y,
a.z*b.x - a.x*b.z,
a.x*b.y - a.y*b.x
);
}
//一个3*3的矩阵
class Matrix3x3
{
public:
float m11, m12, m13;
float m21, m22, m23;
float m31, m32, m33;
};
//矩阵*矩阵
Matrix3x3& operator*(const Matrix3x3& a, const Matrix3x3& b)
{
Matrix3x3 r;
r.m11 = a.m11*b.m11 + a.m12*b.m21 + a.m13*b.m31;
r.m12 = a.m11*b.m12 + a.m12*b.m22 + a.m13*b.m32;
r.m13 = a.m11*b.m13 + a.m12*b.m23 + a.m13*b.m33;
r.m21 = a.m21*b.m11 + a.m22*b.m21 + a.m23*b.m31;
r.m22 = a.m21*b.m12 + a.m22*b.m22 + a.m23*b.m32;
r.m23 = a.m21*b.m13 + a.m22*b.m23 + a.m23*b.m33;
r.m31 = a.m31*b.m11 + a.m32*b.m21 + a.m33*b.m31;
r.m32 = a.m31*b.m12 + a.m32*b.m22 + a.m33*b.m32;
r.m33 = a.m31*b.m13 + a.m32*b.m23 + a.m33*b.m33;
return r;
}
//向量*矩阵
Vector3 operator*(const Vector3& p, const Matrix3x3& m)
{
return Vector3(
p.x*m.m11 + p.y*m.m21 + p.z*m.m31,
p.x*m.m12 + p.y*m.m22 + p.z*m.m32,
p.x*m.m13 + p.y*m.m23 + p.z*m.m33
);
}
//矩阵*矩阵的另一种方式
Matrix3x3& operator*=(Matrix3x3& a, const Matrix3x3& b)
{
a = a*b;
return a;
}
//向量*矩阵的另一种方式
Vector3 operator*=(Vector3& p, const Matrix3x3& m)
{
p = p*m;
return p;
}
//输出一个矩阵
void print_m(Matrix3x3 m)
{
cout<<m.m11<<"\t"<<m.m12<<"\t"<<m.m13<<endl;
cout<<m.m21<<"\t"<<m.m22<<"\t"<<m.m23<<endl;
cout<<m.m31<<"\t"<<m.m32<<"\t"<<m.m33<<endl;
}
int main()
{
cout<<"hello, 矩阵!"<<endl;
//定义两个矩阵,使这两个矩阵相乘
Matrix3x3 a, b, c;
a.m11 = 1; a.m12 = -5; a.m13 = 3;
a.m21 = 0; a.m22 = -2; a.m23 = 6;
a.m31 = 7; a.m32 = 2; a.m33 = -4;
//print_m(a);
cout<<endl<<endl;
b.m11 = -8; b.m12 = 6; b.m13 = 1;
b.m21 = 7; b.m22 = 0; b.m23 = -3;
b.m31 = 2; b.m32 = 4; b.m33 = 5;
//print_m(b);
cout<<endl<<endl;
c = a*b; //一个矩阵*另一个矩阵
print_m(c);
a*=b;
print_m(a); //一个矩阵*另一个矩阵的另一种方式
cout<<endl;
//定义一个向量和一个矩阵,使这个向量和这个矩阵相乘
Vector3 v(3,-1,4);
Matrix3x3 m;
m.m11 = -2; m.m12 = 0; m.m13 = 3;
m.m21 = 5; m.m22 = 7; m.m23 = -6;
m.m31 = 1; m.m32 = -4; m.m33 = 2;
Vector3 r;
r = v*m; //一个向量*一个矩阵
print_v(r);
v*=m; //一个向量*一个矩阵的另一种方式
print_v(v);
return 0;
}
相关文章推荐
- 3d数学基础-4x4齐次矩阵-用C++代码实现
- 3d数学基础-镜像矩阵和切变矩阵-用C++代码实现
- C/C++实现矩阵相乘(一)
- 矩阵相乘-c++代码实现及运行实例结果
- C++实现两个矩阵相乘
- 矩阵相乘-c++代码实现及运行实例结果
- 实现稀疏矩阵相乘C/C++
- 矩阵相乘strassen-c++代码实现及运行实例结果
- c++实现两个矩阵相乘
- 矩阵相乘strassen-c++代码实现及运行实例结果
- 矩阵相乘strassen-c++代码实现及运行实例结果
- 3d数学基础-欧拉角转换与旋转矩阵或旋转矩阵转换成欧拉角-用C++代码实现
- 矩阵相乘strassen-c++代码实现及运行实例结果
- [置顶] C++实现任意复数、实数、矩阵相乘(要求用重载函数)
- 矩阵相乘-c++代码实现及运行实例结果
- 矩阵相乘strassen-c++代码实现及运行实例结果
- 3d数学基础-缩放矩阵,投影矩阵-用C++实现
- 矩阵相乘-c++代码实现及运行实例结果
- 矩阵相乘strassen-c++代码实现及运行实例结果
- 3d数学基础-矩阵的逆-用C++代码实现