稀疏矩阵转置和相乘C++(三元组存储稀疏矩阵 二维数组存储三元组

①问题描述
存在如下表两个稀疏矩阵M和N,完成M矩阵的转置以及M和N矩阵的乘法运算,将结果按要求显示出来。
M矩阵、N矩阵
②输入数据: 矩阵行值row 、矩阵列值col 、矩阵非零元素个数t,以及每一个非零元素行、列、数值,以三元组做存储,将M矩阵以及N矩阵存储。
M矩阵三元组存储、N矩阵三元组存储
③将M矩阵转置,转置矩阵也采用三元组存储;转置矩阵输出按照传统矩阵方式输出
④将M矩阵与N矩阵相乘,结果输出

#include <iostream>
using namespace std;
#define size  100
void ZZ(int A[size][3], int B[size][3])
{
    B[0][0] = A[0][1];
    B[0][1] = A[0][0];
    B[0][2] = A[0][2];
    int num[size],i;
    int pot[size];
    pot[1] = 1;
    for (int i = 1;i <= B[0][0];i++)
        num[i] = 0;
    for (i = 1;i <= B[0][2];i++)
        num[A[i][1]]++;
    for (i = 2;i <= B[0][0];i++)
        pot[i] = pot[i - 1] + num[i - 1];
    for (i = 1;i <= B[0][2];i++)
    {
        int row = A[i][1];
        B[pot[row]][0] = A[i][1];
        B[pot[row]][1] = A[i][0];
        B[pot[row]][2] = A[i][2];
        pot[row]++;
    }
    cout << "转置矩阵为:" << endl;
    int C[size];//以数组形式保存
    for (i = 0;i < B[0][0] * B[0][1];i++)
        C[i] = 0;
    for (i = 1;i <= B[0][2];i++)
        C[(B[i][0] - 1) * (B[0][1]) + (B[i][1]) - 1] = B[i][2];
    for (i = 0;i < B[0][0] * B[0][1];i++)
    {
        cout << C[i];
        cout << " ";
        if ((i + 1) % B[0][1] == 0)
            cout << "\n";
    }
}
void xc(int A[size][3], int B[size][3])
{
    int num[size], pot[size],i;
    int C[size];
    for (int i = 0;i < A[0][0] * B[0][1];i++)//初始化c
        C[i] = 0;
    for (i = 1;i <= B[0][0];i++)//初始化
        num[i] = 0;
    for (i = 1;i <= B[0][2];i++)//求每行几个非零
        num[B[i][0]]++;
    pot[1] = 1;
    for (i = 2;i <= B[0][0];i++)//求B矩阵第i行第一个非零元素在三元组的行号
        pot[i] = pot[i - 1] + num[i - 1];
    for (i = 1;i <= B[0][0];i++)//特殊情况排除
    {
        if (num[i] == 0)
            pot[i] = 0;
    }
    for (i = 1;i <= A[0][2];i++)
    {
        int row = A[i][1];//A非零元素的列
        int j = pot[row];//A非零元素的列所对应B的行
        for (;;)
        {
            if (j == 0)
            {
                j++;
                break;
            }
            else
            {
                C[(A[i][0] - 1) * B[0][1] + (B[j][1]) - 1] += A[i][2] * B[j][2];
                j++;
                if (row != B[j][0] || j > B[0][2])
                    break;
            }
        }
    }
    cout << "结果为:" << endl;
    for (i = 0;i < A[0][0] * B[0][1];i++)//输出矩阵形式
    {
        cout << C[i];
        cout << " ";
        if ((i + 1) % B[0][1] == 0)
            cout << "\n";
    }
}
void sr(int A[size][3])
{
    int h, l, nzero = 0, j = 1;
    cout << "先输入矩阵的行:";
    cin >> h;
    cout << "再输入矩阵的列:";
    cin >> l;
    cout << "输入矩阵:" << endl;
    int a;
    A[0][0] = h;
    A[0][1] = l;
    for (int i = 0;i < (h * l);i++)//存为三元组
    {
        cin >> a;
        if (a != 0)
        {
            nzero++;
            A[j][0] = (i / l) + 1;
            A[j][1] = (i % l) + 1;
            A[j][2] = a;
            j++;
        }
    }
    A[0][2] = nzero;
}
void main()
{
    int A[size][3], B[size][3];
    int pd;
    cout << "输入一个矩阵" << endl;
    sr(A);
    cout << "求转置输入1,求乘法输入2" << endl;
    cin >> pd;
    if (pd == 1)
        ZZ(A, B);
    if (pd == 2)
    {
        cout << "输入乘矩阵" << endl;
        sr(B);
        if (A[0][1] != B[0][0])
            cout << "无法相乘" << endl;
        else
            xc(A, B);
    }
}

from 缪哥

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值