矩阵的乘法在程序中作用有很多的体现。
前两天接触的那个题,可以使用矩阵连乘,然后,二分计算快速解答。由于是第一次接触,花了好一会才明白点所以然,这里小小的总结一下。
首先,使用矩阵连乘的好处:可以实现快速计算。
其次,如何把问题转化成矩阵连乘的形式。
这里举例说明。
拿fibonacci举例。
fibonacci公式:F[n]=F[n-1]+F[n-2];
可以先观察下这个式子:
1 1
【F[n-1],F[n-2] 】* 【 】 (囧~~~不会在这里插入数学公式,只好省略矩阵的大括号)
1 0
=【F[n-1]+F[n-2],F[n-1]】
这时还没有发现什么的话,再乘一次
1 1
【F[n-1]+F[n-2],F[n-1] *【 】
1 0
=【2F[n-1]+F[n-2],F[n-1]+F[n-2]】
也就是说,
1 1
F[1]=【0,1】* 【 】 的前一个项
1 0
即
1 1
F[n]=【0,1】 * 【 】 的n次幂的第一项
1 0
到此就把题目转化成了求矩阵乘法。其中,
1 1
【 】 是该矩阵乘法的初始矩阵。【0,1】的名字不知道叫什么,假定是结果矩阵
1 0
再者,初始矩阵的求法
这里举例说明,假设F[n]=3F[n-1]-F[n-2](牵扯m个F[n]初始矩阵就是m*m的矩阵,结果矩阵就是1*m的矩阵)
此时,m=2,由于肯定会知道F[0],F[1],F[2]这些初始值。即结果矩阵就是【F[n-1],F[n-2]】
利用矩阵的求法,可以计算出初始矩阵。
a b
【F[n-1],F[n-2]】*【 】观察可知,a=3,c=-1(第一行乘第一列得F[n]);b=1,d=0(第一行乘以第二列得F[n-1])。
c d
最后,如何实现快速计算。
利用二分法,计算矩阵的n次幂,由于m^2=(m*m),m^4=m^2*m^2,m^8=m^4*m^4,计算m^8只需要乘3次,可以节省很多时间。这里不再贴代码。
在这里附上我的Matrix模板
#include<iostream>
template<class T>
class Matrix
{
public:
Matrix();//构造函数
Matrix(const Matrix<T> &m);//拷贝构造函数
Matrix(int r,int c);//初始化一个矩阵,利用行和列
~Matrix(){delete m_elem;}
void display();
void trans();//转置
Matrix operator =(const Matrix<T> & m);
T & operator[](int pos);
Matrix operator +(const Matrix<T> & m);
Matrix operator -(const Matrix<T> & m);
Matrix operator *(const Matrix<T> & m);
bool operator ==(const Matrix<T> & m);
private:
T * m_elem;//指向元素的指针(类)
int row,column;
};
template<class T>
Matrix<T>::Matrix(int r,int c):row(r),column(c)
{
if (row==0||column==0)
{
m_elem=NULL;
}
else
{
m_elem= new T[row*column];
if (!m_elem)
{
cout<<"无法分配内存";
}
cout<<"创建一个"<<row<<"行"<<column<<"列的矩阵"<<endl;
for (int i=0;i<row;i++)
{
for (int j=0;j<column;j++)
{
cin>>m_elem[i*column+j];
}
}
}
}
template <class T>
Matrix<T>::Matrix()
{
cout<<"\n请输入行数 列数:";
cin>>row>>column;
m_elem = new T[row * column];
if (!m_elem)
{
cout<<"无法分配内存";
}
cout<<"创建一个"<<row<<"行"<<column<<"列的矩阵"<<endl;
for (int i=0;i<row;i++)
{
for (int j=0;j<column;j++)
{
cin>>m_elem[i*column+j];
}
}
}
template <class T>
Matrix<T>::Matrix(const Matrix<T> &m)
{
this->m_elem = new T[m.row * m.column];
if (!m_elem)
{
cout<<"无法分配内存";
}
row = m.row;
column = m.column;
memcpy(m_elem,m.m_elem,sizeof(T) * row * column);
}
template<class T>
T & Matrix<T>::operator[](int pos)
{
return m_elem[pos];
}
template<class T>
Matrix<T> Matrix<T>::operator +(const Matrix<T> & m)
{
Matrix<T> mresult(*this);
if (row!=Matrix::row||this->column!=Matrix::column)
{
cout<<"不同的矩阵不能相加";
}
else
{
for (int i=0;i<row*column;i++)
{
mresult.m_elem[i]+=m.m_elem[i];
}
}
return mresult;
}
template<class T>
Matrix<T> Matrix<T>::operator -(const Matrix<T> & m)
{
{
if (this.row!=Matrix::row||this->column!=Matrix::column)
{
cout<<"不同的矩阵不能相减";
}
else
{
Matrix<T> mresult(*this);
for (int i=0;i<row*column;i++)
{
mresult.m_elem[i]-=m.m_elem[i];
}
return mresult;
}
}
}
template<class T>
Matrix<T> Matrix<T>::operator *(const Matrix<T> & m)
{
Matrix<T> mresult(0,0);
mresult.m_elem=new T[row*m.column];
mresult.row=row;
mresult.column=m.column;
if (column!=m.row)
{
cout<<"不符合计算要求";
}
else
{
for (int i=0;i<row*m.column;i++)
{
int sum=0;
for (int j=0;j<=m.column;j++)
{
sum+=m_elem[i/m.column*column+j]*m.m_elem[m.column*j+(i%m.column)];
}
mresult.m_elem[i]=sum;
}
}
return mresult;
}
template<class T>
void Matrix<T>::trans()
{
Matrix<T> mresult(*this);
int num=row*column-1;
for (int i=0;i<=num;i++)
{
mresult.m_elem[i]=m_elem[(column*i)%num];
}
//return mresult;
}
template <class T>
Matrix<T> Matrix<T>::operator = (const Matrix<T> &m)
{
this->m_elem = new T[m.row * m.column];
if (!m_elem)
{
cout<<"无法分配内存";
}
row = m.row;
column = m.column;
memcpy(m_elem,m.m_elem,sizeof(T) * row * column);
return *this;
}
template<class T>
bool Matrix<T>::operator ==(const Matrix<T> & m)
{
if (row!=m.row||column!=m.column)
{
return false;
}
else
for (int i=0;i<row*column;i++)
{
if(m_elem[i]!=m.m_elem[i])
{
return false;
}
}
return true;
}
template <class T>
void Matrix<T>::display()
{
for (int i=0;i<row*column;i++)
{
cout<<m_elem[i]<<" ";
if (i&&i%column)
{
cout<<endl;
}
}
}
分享到:
相关推荐
这是基于c的4096阶矩阵乘法的源程序,可以测量乘法计算时间
基于Pthread的多线程并行矩阵乘法,包含1000*1000矩阵随机矩阵生成代码,和串行矩阵乘法的比较,c++实现,Windows系统。
算法-矩阵乘法(信息学奥赛一本通-T1125)(包含源程序).rar
矩阵乘法MPI并行程序报告.pdf矩阵乘法MPI并行程序报告.pdf矩阵乘法MPI并行程序报告.pdf矩阵乘法MPI并行程序报告.pdf
矩阵乘法mpi实现 并行运算 在linux下成功运行 使用mpicc -o 编译 使用mpirun命令运行
汇编语言编写的给予BF535完成6X6矩阵相成A*B+C*D的程序设计,及其优化,分布式优化,从...将近完美,另外提示更好做法——在一个子程序中完成两次矩阵相成,时钟数还会有所减少,不过方法不得当会还不如本实验结果。
并行实现矩阵乘法,summa算法,并行更高效~并行实现矩阵乘法,summa算法,并行更高效~
矩阵乘法 GPU并行 CUDA程序 MATLAB + CUDA+C 亲测可运行
linux下多线程实现矩阵乘法,可以对操作系统的线程有更多理解
C++矩阵乘法C++矩阵乘法C++矩阵乘法C++矩阵乘法C++矩阵乘法
1. 在Windows操作系统上,利用Windows API编写应用程序实现矩阵乘法。 2. 在Linux操作系统上,利用Pthread API编写应用程序实现矩阵乘法。 3. 在上述两种环境下,实现相乘操作的两个矩阵均作为应用程序的输入...
从文件arr.in中读入一个m行k列的整数矩阵a和一个k行n列的整数矩阵b(1 , k, n ),在标准输出上输出这两个矩阵的乘积。 【输入形式】 输入文件arr.in中有m+k行,前m行是矩阵a的元素aij,后k行是矩阵b的元素bij...
矩阵乘法用途广泛。该程序为本人编写。附有测试代码。请大家批评指正。
matlab实现矩阵乘法代码CUDA矩阵乘以MEX 可以在nvidia gpu上执行矩阵乘法的mex函数,取决于可用的硬件,其性能可能会大大提高。 不需要Matlab的并行计算工具箱。 这是通过分别编译一个执行矩阵乘法的cuda函数和一个...
10.俞华程《矩阵乘法在信息学中的应用》10.俞华程《矩阵乘法在信息学中的应用》
在这个应用程序中,用户可以探索矩阵乘法背后的过程。 选择每个矩阵的行和列,看看如何确定产品的条目。 用户还可以选择产品中要关注的行或列,以查看特定的计算结果。
此程序是关于矩阵乘法的,有cuda矩阵乘法和cpu矩阵乘法的对比,可以作为参考
用Hadoop实现的大矩阵乘法,包括代码设计思路以及可以执行的源代码。已在hadoop-1.0.3平台测试通过,对初学者是很好的材料。
算法-矩阵乘法的程序(包含源程序).rar
CUDA实例-矩阵乘法 一个简单的矩阵乘法例子