#include <iostream>
using namespace std
typedef int Elemtype
#define MAXSIZE 12500 //最大非零元素
typedef struct Triple
{
Elemtype value
int row,col
}Triple
typedef struct TSMatrix
{
Triple data[MAXSIZE+1]
int mu,nu,tu
}TSMatrix
TSMatrix T
void InputMatrix(TSMatrix &T) //输入t个非零元素
{
cout<<"请输入稀疏矩阵的信息,(行,列,非零元素个备世谨数)"<<endl
cin>>T.mu>>T.nu>>T.tu
int i
cout<<"请输返弯入非零元素的信息(行,列,值),提醒(下标从1开始)"<<endl
for(i=1i<仿基=T.tu++i)
{
cin>>T.data[i].row>>T.data[i].col>>T.data[i].value
}
}
void Output(TSMatrix T)
{
cout<<"矩阵的三元组表示(ROW=)"<<T.mu<<" COL="<<T.nu<<"非零个数="<<T.tu<<endl
int i
for(i=1i<=T.tu++i)
{
cout<<"ROW(行):"<<T.data[i].row<<" COL(列):"<<T.data[i].col<<" Value(值)"<<T.data[i].value<<endl
}
}
void TransposeSMatrix(TSMatrix M,TSMatrix &T) //矩阵的转置
{
T.mu=M.nuT.nu=M.muT.tu=M.tu
int i,j,k=1
for(i=1i<=M.nu++i)
{
for(j=1j<=M.tu++j)
if(M.data[j].col==i)
{
T.data[k].row=i
T.data[k].col=M.data[j].row
T.data[k].value=M.data[j].value
++k
}
}
}
void AddMastrix(TSMatrix M,TSMatrix T,TSMatrix &Q) //矩阵相加
{
int index_a,index_b,i=1,j=1,k=1
Q.mu=M.muQ.nu=M.nu
while (i<=M.tu&&j<=T.tu)
{
index_a=(M.data[i].row)*(M.data[i].col)+M.data[i].col
index_b=(T.data[j].row)*(T.data[j].col)+T.data[j].col
if(index_a<index_b)
{
Q.data[k]=M.data[i]
i++
k++
}
else if(index_a>index_b)
{
Q.data[k]=T.data[j]
j++
k++
}
else if(index_a==index_b)
{
if((M.data[i].value+T.data[j].value)!=0)
{
Q.data[k]=M.data[i]
Q.data[k].value=M.data[i].value+T.data[j].value
k++
}
++i
++j
}
}
//复制剩余元素
for(i<=M.tu++i)
{
Q.data[k]=M.data[i]
k++
}
for(j<=T.tu++j)
Q.data[k++]=T.data[j]
Q.tu=k-1
}
void Multiply(TSMatrix M,TSMatrix T,TSMatrix &Q) //相乘
{
if(M.nu!=T.mu)
{
cerr<<"两矩阵相乘不合法"<<endl
return
}
int *rowSize=new int[T.mu+1]//存放每行非零元素的个数
int *rowStart=new int[T.mu+2]//矩阵每行在三元组开始位置
int *temp=new int[T.nu+1] //存放结果矩阵中每行的计算结果
int i,Current,k,ROWM,COLM,COLB
for(i=1i<=T.mui++) rowSize[i]=0
for(i=1i<=T.tu++i) rowSize[T.data[i].row]++
rowStart[1]=1
for(i=2i<=T.mu+1i++)
rowStart[i]=rowStart[i-1]+rowSize[i-1]
Current=1k=1
while (Current<=M.tu)
{
ROWM=M.data[Current].row //当前三元组数据中元素的行号
for(i=1i<=T.nu++i) temp[i]=0
while (Current<=M.tu&&ROWM==M.data[Current].row)
{
COLM=M.data[Current].col //当前元素的列号,方便与T矩阵的行号相乘
for(i=rowStart[COLM]i<rowStart[COLM+1]i++) //对应T矩阵中每行的个数
{
COLB=T.data[i].col
temp[COLB]+=(M.data[Current].value)*(T.data[i].value)
}
Current++
}
for(i=1i<=T.nui++)
{
if(temp[i]!=0)
{
Q.data[k].row=ROWM
Q.data[k].col=i
Q.data[k].value=temp[i]
}
k++
}
}
Q.mu=M.muQ.nu=T.nu
Q.tu=k-1
}
int main()
{
TSMatrix T,M,Q,S
InputMatrix(M)
InputMatrix(T)
cout<<"两矩阵相乘"<<endl
Multiply(M,T,Q)
Output(Q)
cout<<"两矩阵相加"<<endl
AddMastrix(M,M,S)
Output(S)
system("pause")
return 0
}
矩阵三角化不知道是什么,其余的看下面代码:bool addMat(int **mat1, int **mat2, int **matR, int row, int col)
{
for(int i = 0i <rowi++)
{
for(int j = 0j <colj++)
{
*((int*)matR+i*col+j) = *((int*)mat1+i*col+j) + *((int*)mat2+i*col+j)
}
}
return true
}
bool subMat(int **mat1, int **mat2, int **matR, int row, int col)
{
for(int i = 0i <rowi++)
{
for(int j = 0j <colj++)
{
*((int*)matR+i*col+j) = *((int*)mat1+i*col+j) - *((int*)mat2+i*col+j)
}
}
return true
}
bool mulMat(int **mat1, int row1, int col1, int **mat2, int row2, int col2, int **matR)
{
if(col1 != row2)
{
return false
}
int temp1
for(int i = 0i <row1i++)
{
for(int j = 0j <col2j++)
{
temp1 = 0
for(int k = 0k <col1k++)
{
temp1 += *((int*)mat1+i*col1+k) * *((int*)mat2+k*col2+j)
}
*((int*)matR+i*col2+j) = temp1
}
}
return true
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)