矩阵运算

 
//==============================================================================
//
// 05软件 jacklam
// 矩阵运算
// matrix.cpp
//==============================================================================
#include "iostream.h"
#include "stdlib.h"
#define maxsize 12500
//--------------------三元组行逻辑存储结构--------------------------------------
typedef struct
{
int i,j;
int e;
}triple;
typedef struct
{
triple data[maxsize];
int mu,nu,tu;
int rpos[maxsize];
}rlsmatrix;
//--------------------三元组行逻辑计算------------------------------------------
rls(rlsmatrix &m)
{
int num[maxsize];
for(int k=1;k<=m.tu;++k)          //计算行非0值个数;
  num[k]=0;
for(k=1;k<=m.mu;++k)
  ++num[m.data[k].i];
m.rpos[1]=1;            //计算行逻辑;
for(k=2;k<=m.mu;k++)
  m.rpos[k]=m.rpos[k-1]+num[k-1];
return 1;
}//-----------------------------------------------------------------------------
//--------------------三元组行逻辑创建------------------------------------------
creatematrix(rlsmatrix &m)
{
cout<<"please input the row and col:";
cin>>m.mu>>m.nu;
cout<<"please input the none zero number:";
cin>>m.tu;
cout<<"please input the value of matrix:eg(1 2 3)"<<endl;
for(int k=1;k<=m.tu;++k)
cin>>m.data[k].i>>m.data[k].j>>m.data[k].e;
rls(m);
return 1;
}//-----------------------------------------------------------------------------
//-------------------三元组行逻辑输出-------------------------------------------
print(rlsmatrix m)
{
cout<<"the matrix value:"<<endl;
for(int k=1;k<=m.tu;++k)         //输出三元组;
  cout<<m.data[k].i<<"   "<<m.data[k].j<<"   "<<m.data[k].e<<endl;
/*cout<<"this is its rls:"<<endl;
for(k=1;k<=m.mu;++k)          //输出行逻辑;
  cout<<m.rpos[k]<<"  ";
cout<<endl;*/
return 1;
}//-----------------------------------------------------------------------------
//-------------------矩阵相加---------------------------------------------------
add(rlsmatrix m,rlsmatrix t,rlsmatrix &l)
{
int p=1,q=1,k=1;
if(m.mu!=t.mu||m.nu!=t.nu)      //行不相等,列不相等
{
  cout<<"can"t add!"<<endl;     //不能进行相加
  return 0;
}
else
{
  l.mu=m.mu;
  l.nu=t.nu;
  l.tu=0;
  while(p<=m.tu&&q<=t.tu)
  {
  
   if(m.data[p].i<t.data[q].i || m.data[p].i==t.data[q].i&&m.data[p].j<t.data[q].j)
   {
    l.data[k].i=m.data[p].i;
    l.data[k].j=m.data[p].j;
    l.data[k].e=m.data[p].e;
    k++;p++;
   }
   else if((m.data[p].i==t.data[q].i)&&(m.data[p].j==t.data[q].j))
   {
    l.data[k].i=m.data[p].i;
    l.data[k].j=m.data[p].j;
    l.data[k].e=m.data[p].e+t.data[q].e;
    ++p;++q;++k;
   }
   else
   {
    l.data[k].i=t.data[q].i;
    l.data[k].j=t.data[q].j;
    l.data[k].e=t.data[q].e;
    k++;q++;
   }
  }
   while(p<=m.tu)
   {
    l.data[k].i=m.data[p].i;
    l.data[k].j=m.data[p].j;
    l.data[k].e=m.data[p].e;
    ++k;++p;
   }
   while(q<=t.tu)
   {
    l.data[k].i=t.data[q].i;
    l.data[k].j=t.data[q].j;
    l.data[k].e=t.data[q].e;
    ++k;++q;
   }
}
    l.tu=k-1;
//rls(l);
return 1;
}//-----------------------------------------------------------------------------
//-------------------矩阵相减---------------------------------------------------
sub(rlsmatrix m,rlsmatrix t,rlsmatrix &l)
{
int p=1,q=1,k=1;
if(m.mu!=t.mu||m.nu!=t.nu)      //行不相等,列不相等
{
  cout<<"can"t sub!"<<endl;     //不能进行相减
  return 0;
}
else
{
  l.mu=m.mu;
  l.nu=t.nu;
  l.tu=0;
  while(p<=m.tu&&q<=t.tu)
  {
  
   if(m.data[p].i<t.data[q].i || m.data[p].i==t.data[q].i&&m.data[p].j<t.data[q].j)
   {
    l.data[k].i=m.data[p].i;
    l.data[k].j=m.data[p].j;
    l.data[k].e=m.data[p].e;
    k++;p++;
   }
   else if((m.data[p].i==t.data[q].i)&&(m.data[p].j==t.data[q].j))
   {
    l.data[k].i=m.data[p].i;
    l.data[k].j=m.data[p].j;
    l.data[k].e=m.data[p].e-t.data[q].e;
    ++p;++q;++k;
   }
   else
   {
    l.data[k].i=t.data[q].i;
    l.data[k].j=t.data[q].j;
    l.data[k].e=-t.data[q].e;
    k++;q++;
   }
  }
   while(p<=m.tu)
   {
    l.data[k].i=m.data[p].i;
    l.data[k].j=m.data[p].j;
    l.data[k].e=m.data[p].e;
    ++k;++p;
   }
   while(q<=t.tu)
   {
    l.data[k].i=t.data[q].i;
    l.data[k].j=t.data[q].j;
    l.data[k].e=-t.data[q].e;
    ++k;++q;
   }
}
    l.tu=k-1;
//rls(l);
return 1;
}//-----------------------------------------------------------------------------
//-------------------矩阵相乘---------------------------------------------------
multsmatrix(rlsmatrix matrix,rlsmatrix t,rlsmatrix &m)
{
int ctemp[maxsize];
int arow,tp,ccol,brow,tq;
if(t.mu!=matrix.nu)
{
  cout<<"can"t mulitify!"<<endl;
  return 0;
}
m.mu=matrix.mu;m.nu=t.nu;m.tu=0;
if(matrix.tu*t.tu!=0)
{
  for(arow=1;arow<=matrix.mu;++arow)
  {
   for(int i=0;i<maxsize;++i)
    ctemp[i]=0;
   m.rpos[arow]=m.tu+1;
   if(arow<matrix.mu)
    tp=matrix.rpos[arow+1];
   else
    tp=matrix.tu+1;
   for(int p=matrix.rpos[arow];p<tp;++p)
   {
    brow=matrix.data[p].j;
    if(brow<t.mu)
     tq=t.rpos[brow+1];
    else
     tq=t.tu+1;
    for(int q=t.rpos[brow];q<tq;++q)
    {
     ccol=t.data[p].j;
     ctemp[ccol]+=matrix.data[p].e*t.data[q].e;
    }
   }
   for(ccol=1;ccol<=m.nu;++ccol)
    if(ctemp[ccol])
    {
     if(++m.tu>maxsize)
      return 0;
     m.data[m.tu].i=arow;
     m.data[m.tu].j=ccol;
     m.data[m.tu].e=ctemp[ccol];
    }
  }
}
return 1;
}
//--------------------------------主函数----------------------------------------
main()
{
rlsmatrix m,t,l;
creatematrix(m);
print(m);
creatematrix(t);
print(t);
add(m,t,l);
cout<<"this is add result:"<<endl;
print(l);
sub(m,t,l);
cout<<"this is sub result:"<<endl;
print(l);
multsmatrix(m,t,l);
cout<<"this is mutiply result:"<<endl;
print(l);
return 1;
}//=============================================================================
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值