#include<stdio.h>
#include<stdlib.h>#define OK 1
#define ERROR 0typedef int ElemType, Status;#define MAXSIZE 256typedef struct
{int i, j;    //数据所在的行、列值ElemType v;    //数据元素值
}Triple;typedef struct
{Triple arr[MAXSIZE];    //非零元素的三元组int Rows, Cols, Nums;    //矩阵的行数、列数、非零元素个数
}SqSMatrix;Status CtreateSMatrix(SqSMatrix& M)    //矩阵的创建
{printf("行数:");scanf_s("%d", &M.Rows);printf("列数:");scanf_s("%d", &M.Cols);printf("非零元个数:");scanf_s("%d", &M.Nums);printf("按行优先依次输入元素的行值、列值、数值:\n");int i = 0;while (i < M.Nums){scanf_s("%d%d%d", &M.arr[i].i, &M.arr[i].j, &M.arr[i].v);i++;}return OK;
}Status DestroySMatrix(SqSMatrix& M)    //矩阵的销毁
{M.Cols = 0;M.Nums = 0;M.Rows = 0;return OK;
}Status PrintSMatrix(SqSMatrix M)    //矩阵的输出
{if (M.Rows == 0) return ERROR;int cnt = 0;for (int i = 0; i < M.Rows; i++){for (int j = 0; j < M.Cols; j++){if (cnt < M.Nums && M.arr[cnt].i == i && M.arr[cnt].j == j){printf("%d  ", M.arr[cnt].v);cnt++;}printf("0  ");}printf("\n");}return OK;
}Status CopySMatrix(SqSMatrix M, SqSMatrix &T)    //矩阵的拷贝
{if (M.Rows == 0) return ERROR;T.Nums = M.Nums;T.Rows = M.Rows;T.Cols = M.Cols;int cnt = 0;while (cnt < M.Nums){T.arr[cnt].i = M.arr[cnt].i;T.arr[cnt].j = M.arr[cnt].j;T.arr[cnt].v = M.arr[cnt].v;cnt++;}return OK;
}Status AddSMatrix(SqSMatrix M, SqSMatrix N, SqSMatrix& Q)    //矩阵相加
{if (M.Cols != N.Cols || M.Rows != N.Rows) return ERROR;Q.Cols = M.Cols;Q.Rows = M.Rows;int mi = 0;int ni = 0;int i = 0;while (mi != M.Nums && ni != N.Nums){if (M.arr[mi].i == N.arr[ni].i && M.arr[mi].j == N.arr[ni].j){Q.arr[i].i = M.arr[mi].i;Q.arr[i].j = M.arr[mi].j;Q.arr[i].v = M.arr[mi].v + N.arr[ni].v;i++;mi++;ni++;}if (M.arr[mi].i < N.arr[ni].i){Q.arr[i].i = M.arr[mi].i;Q.arr[i].j = M.arr[mi].j;Q.arr[i].v = M.arr[mi].v;i++;mi++;}if (M.arr[mi].i == N.arr[ni].i && M.arr[mi].j < N.arr[ni].j){Q.arr[i].i = M.arr[mi].i;Q.arr[i].j = M.arr[mi].j;Q.arr[i].v = M.arr[mi].v;i++;mi++;}else{Q.arr[i].i = N.arr[ni].i;Q.arr[i].j = N.arr[ni].j;Q.arr[i].v = N.arr[ni].v;i++;ni++;}}while (mi < M.Nums){Q.arr[i].i = M.arr[mi].i;Q.arr[i].i = M.arr[mi].j;Q.arr[i].v = M.arr[mi].v;i++;mi++;}while (ni < N.Nums){Q.arr[i].i = N.arr[ni].i;Q.arr[i].j = N.arr[ni].j;Q.arr[i].v = N.arr[ni].v;i++;ni++;}Q.Nums = i;return OK;
}Status SubSMatrix(SqSMatrix M, SqSMatrix N, SqSMatrix& Q)    //矩阵相减
{if (M.Cols != N.Cols || M.Rows != N.Rows) return ERROR;Q.Cols = M.Cols;Q.Rows = M.Rows;int mi = 0;int ni = 0;int i = 0;while (mi != M.Nums && ni != N.Nums){if (M.arr[mi].i == N.arr[ni].i && M.arr[mi].j == N.arr[ni].j){Q.arr[i].i = M.arr[mi].i;Q.arr[i].j = M.arr[mi].j;Q.arr[i].v = M.arr[mi].v - N.arr[ni].v;i++;mi++;ni++;}if (M.arr[mi].i < N.arr[ni].i){Q.arr[i].i = M.arr[mi].i;Q.arr[i].j = M.arr[mi].j;Q.arr[i].v = M.arr[mi].v;i++;mi++;}if (M.arr[mi].i == N.arr[ni].i && M.arr[mi].j < N.arr[ni].j){Q.arr[i].i = M.arr[mi].i;Q.arr[i].j = M.arr[mi].j;Q.arr[i].v = M.arr[mi].v;i++;mi++;}else{Q.arr[i].i = N.arr[ni].i;Q.arr[i].j = N.arr[ni].j;Q.arr[i].v = -N.arr[ni].v;i++;ni++;}}while (mi < M.Nums){Q.arr[i].i = M.arr[mi].i;Q.arr[i].i = M.arr[mi].j;Q.arr[i].v = M.arr[mi].v;i++;mi++;}while (ni < N.Nums){Q.arr[i].i = N.arr[ni].i;Q.arr[i].j = N.arr[ni].j;Q.arr[i].v = -N.arr[ni].v;i++;ni++;}Q.Nums = i;return OK;
}//三元组稀疏矩阵的转置方法——1.简单方法、2.列序遍历法、3.快速转置法/*1.简单方法:把三元组表中行和列的内容互换,然后按照行号对新的三元组表中的各三元
组从小到大进行排序,就可以得到转置后的三元组表,排序算法采用经典的排序
算法,则时间复杂度为O(Nums*Nums)
*///2.列序遍历的转置算法
Status TransposeSMatrix(SqSMatrix A, SqSMatrix& B)
{//将稀疏矩阵A转置,结果放在稀疏矩阵B中B.Rows = A.Cols;    //B的行数等于A的列数B.Cols = A.Rows;    //B的列数等于A的行数B.Nums = A.Nums;    //B的非零元个数等于A的非零元个数if (A.Nums > 0){int q = 0;int p = 0;for (int k = 0; k < A.Cols; k++){for (p = 0; p < A.Nums; p++){if (A.arr[p].j == k){//若第p个三元组中元素的列号为kB.arr[q].i = A.arr[p].j;    //新三元组中的行号B.arr[q].j = A.arr[p].i;    //新三元组中的列号B.arr[q].v = A.arr[p].v;    //新三元组中的值q++;    //B.arr的当前位置增加1}}}}return OK;
}//3.稀疏矩阵快速转置算法
Status FastTransposeSMatrix(SqSMatrix A, SqSMatrix& B)
{B.Rows = A.Cols;B.Cols = A.Rows;B.Nums = A.Nums;int rowStart[MAXSIZE];int rowNum[MAXSIZE];int k = 0;int p = 0;if (A.Nums > 0){//第一步:统计A中每列非零元素个数for (k = 0; k < A.Cols; k++)    rowNum[k] = 0;    //rowNums数组的初始化for (p = 0; p < A.Nums; p++)    rowNum[A.arr[p].j]++;    //统计A中每列(即B中每行)非零元素个数//第二步:计算B中每行三元组的起始位置rowStart[0] = 0;for (k = 1; k < A.Cols; k++)rowStart[k] = rowStart[k - 1] + rowNum[k - 1];for (p = 0; p < A.Nums; p++){int q = rowStart[A.arr[p].j];B.arr[q].i = A.arr[p].j;B.arr[q].j = A.arr[p].i;B.arr[q].v = A.arr[p].v;rowStart[A.arr[p].j]++;}}return OK;
}

三元组矩阵的基本操作——加、减、矩阵乘、转置相关推荐

  1. (转)深入详细理解矩阵 (矩阵的加减乘、转置、共轭、共轭转置)

    矩阵:英文名Matrix.在数学名词中,矩阵用来表示统计数据等方面的各种有关联的数据.这个定义很好地解释了Matrix代码制造世界的数学逻辑基础.矩阵是数学中最重要的基本概念之一,是代数学的一个主要研 ...

  2. C++实现矩阵加减乘求转置

    一.需求如下: 二.代码如下: #include<vector> #include<iostream> using namespace std; class Matrix { ...

  3. java转置矩阵相乘_java实现矩阵的加-减-乘-转置运算

    <java实现矩阵的加-减-乘-转置运算>由会员分享,可在线阅读,更多相关<java实现矩阵的加-减-乘-转置运算(3页珍藏版)>请在人人文库网上搜索. 1.import ja ...

  4. Python列表实现矩阵的创建、输入输出、转化转置、加减乘运算并设计一个矩阵计算器GUI界面

    背景:在解决一些编程问题中如棋盘的初始化,链表,队列的构建:数据处理中如用SAS软件输入数据等涉及到矩阵的概念,而用编程语言实现矩阵的方式有C中的数组,python中的列表等.现在给你一个数据如下,或 ...

  5. 矩阵的加减乘c语言程序,C语言实现的矩阵加减乘法运算系统

    C语言实现的矩阵加减乘法运算系统 /*本矩阵运算系统可以完成矩阵的加.减.乘法,但是只限于方阵*/ #include<stdio.h> #include<math.h> /*- ...

  6. 矩阵加 减 乘法的C语言实现

    矩阵的加减法:就是对应位置相加减即可 对于满足以下条件的矩阵A,B: 我们有: 加法, 减法, 矩阵的乘法: 对于满足以下条件的矩阵A,B,C: 我们有: 其中: 要注意的是矩阵群没有乘法交换律,也就 ...

  7. 三元组法矩阵加法java_C语言实现矩阵加法、减法、乘法和数乘运算

    一.知识储备 • 矩阵与矩阵之间可以进行加法.减法和乘法运算(矩阵的"除法",被特别地定义出了逆矩阵,通过一个矩阵与另一个的逆矩阵的乘法来实现),矩阵和数之间可以进行数乘运算: • ...

  8. matlab矩阵基本操作,Matlab入门----矩阵的基本操作

    注意:其他编程语言一次只能处理一个数字,而 MATLAB 可以轻松快捷地处理整个矩阵! 1.矩阵的创建 输入元素的明确列表 从外部数据文件加载矩阵 使用内置函数生成矩阵 使用自己的函数创建矩阵,并将其 ...

  9. 总结一下矩阵的基本操作

    总结一下矩阵的基本操作 同步更新于这里 加减法 非常简单,只要对应位置相加就行了(余老师:这不是今天的重点!!! 数乘 嗯,把所有元素同时乘以那个数就行了 矩阵乘矩阵 比较复杂, A*B首先要A的列数 ...

最新文章

  1. golang常用技巧
  2. AngularJS快速入门指南09:SQL
  3. shocked的歌曲 类似shell_Shell Shocked歌词
  4. 阿里工程师是如何系统化地总结缓存相关知识的
  5. centos查看历史指令记录_CentOS清除SSH登录记录、历史命令及日志缓存
  6. 字符串API中的split,substr,substring
  7. php 创建 cookie文件,php创建、获取cookie及基础要点分析
  8. Ubuntu16.04安装网易云音乐后无法打开
  9. 漏洞复现:使用Kali制作木马程序
  10. cpci检索太慢_了解CPCI检索,对自己的好处
  11. LeetCode-自除数
  12. 采用MPI_Send 和MPI_Recv 编写代码来实现包括MPI_Bcast、MPI_Alltoall、MPI_Gather、MPI_Scatter 等MPI 群集通信函数的功能
  13. 《一封来自日本的信——2018年日本社会和生活水平现状》 摘要
  14. 细胞亚器互作综述解读~~~The secret conversations inside cells
  15. 泥瓦匠之 Java 的成长感悟
  16. Unity之ASE 图片遮罩
  17. 涅普2021训练营-MIsc(部分)
  18. 魔法师元素平衡(C++解法)
  19. 计算机考研408考试关键词、专有名词、术语等英文缩写和全称
  20. 一些 差分线的 线距 和 线宽

热门文章

  1. fzyjojP2963 -- [校内训练20161227]疫情控制问题
  2. 在智能手机的硬件外衣下,Google Pixel 3 的本质还是 AI
  3. c++filt command
  4. 【微信小程序】缓存过期时间的相关设置
  5. android过渡动画软件,安卓P过渡动画下载-安卓P过渡动画 v1.0_手机乐园
  6. 网络云盘新增功能(2)
  7. hive mysql 实战_【Hive】HiveQL实战之分析函数窗口函数
  8. 三极管的检测方法与经验
  9. 踏破铁鞋无觅处,得来全不费工夫--删除文本多余空行ClipboardFormatter
  10. Name or service not known