用C语言编写一个矩阵运算的程序,高分!

用C语言编写一个矩阵运算的程序,高分!,第1张

//矩阵三元组之矩阵相加 相乘

#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

}

/**

 * 矩阵:由 m × n 个数Aij排成的m行n列的数表称为m行n列的矩阵,简称m × n矩阵

 * 说白了就是一个二维数组,下面的程序用整形作为数据类型,其他类型运算大同小异

 * 

 */

public class MatrixUtils {

    /**

     * 矩阵运算:加(减法与之类似)

   姿好  */

    public static int[][] matrixAdd(int[][] addend, int[][] summand) {

      逗凳  if (addend == null || addend.length == 0) {

            throw new IllegalArgumentException("addend matrix is empty!")

        }

        if (summand == null || summand.length == 0) {

            throw new IllegalArgumentException("summand matrix is empty!")

        }

        //矩阵加减要求两个矩阵类型一致,即行列数相同

        int row = addend.length

        int col = addend[0].length

        if (row != summand.length || col != summand[0].length) {

            throw new IllegalArgumentException("summand and summand not the same type!")

        }

        int[][] sum = new int[row][col]

        for (int i = 0 i < row i++) {

            for (int j = 0 j < col j++) {

                sum[i][j] = addend[i][j] + summand[i][j]

                // sum[i][j] = addend[i][j] - summand[i][j] //减法

            }

        }

        return sum

    }

    /**

     * 矩阵运算:乘法,没找到除法的运算规则

     */

    public static int[][] matrixMultiply(int[][] addend, int[][] summand) {

        if (addend == null || addend.length == 0) {

            throw new IllegalArgumentException("addend matrix is empty!")

        }

        if (summand == null || summand.length == 0) {

            throw new IllegalArgumentException("summand matrix is empty!")

        }

        //两个矩阵的乘法仅当第一个矩阵A的列数和另一个矩阵B的行数相等时才能定义。如A是m×n矩阵和B是n×p矩阵,它们的乘积C是一个m×p矩阵 

        int row = addend.length

        int col = summand[0].length

        if (addend[0].length != summand.length) {

            throw new IllegalArgumentException("summand and summand not the same type!")

        } 

        int[][] sum = new int[row][col]

        for (int i = 0 i < row i++) {

            for (int j = 0 j < col j++) {

                for (int z = 0 z < addend[0].length z++) {

                    sum[i][j] += addend[i][z] * summand[z][j]

                    System.out.println("sum[" + i+  "山册旅]["+ j+"]= " + sum[i][j])

                }

            }

        }

        return sum

    }

}


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/12352032.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-22
下一篇2023-05-22

发表评论

登录后才能评论

评论列表(0条)

    保存