矩阵相乘最重要的方法是一般矩阵乘积。它只有在第一个矩阵的列数(column)和第二个矩阵的行数(row)相同时才有意义 。一般单指矩阵乘积时,指的便是一般矩阵乘积。一个m×n的矩阵就是m×n个数排成m行n列的一个数阵。由于它把许多数据紧凑地集中到了一起,所以有时候可以简便地表示一些复杂的模型,如电力系统网络模型。

注意事项

1、当矩阵A的列数(column)等于矩阵B的行数(row)时,A与B可以相乘。

2、矩阵C的行数等于矩阵A的行数,C的列数等于B的列数。

3、乘积C的第m行第n列的元素等于矩阵A的第m行的元素与矩阵B的第n列对应元素乘积之和。

函数接口定义

void outputTwoDArray(towDArrayPtr paraPtr);打印矩阵
void randomizeTwoDArray(towDArrayPtr paraPtr, int paraLowerBound, int paraUpperBound);
赋值函数,给每个节点赋初值
towDArrayPtr matrixMultiply(towDArrayPtr paraPtr1,towDArrayPtr paraPtr2);
判断函数,判断俩矩阵是否能进行矩阵乘
void twoDArrayTest();测试函数
void randomizeTwoDArray(towDArrayPtr paraPtr, int paraLowerBound, int paraUpperBound)
{int i, j;  for (i = 0; i < paraPtr->rows; i ++){for (j = 0; j < paraPtr->columns; j ++) {paraPtr->elements[i][j] = rand() % (paraUpperBound - paraLowerBound) + paraLowerBound;}}
}
towDArrayPtr twoDArrayInit(int paraRows,int paraColumns)
{int i; towDArrayPtr resultTwoDArray = (towDArrayPtr)malloc(sizeof(struct twoDArray));resultTwoDArray->rows = paraRows;resultTwoDArray->columns = paraColumns;resultTwoDArray->elements = (int**)malloc(paraRows * sizeof(int*));for(i = 0;i < resultTwoDArray->rows;i ++){resultTwoDArray->elements[i] = (int*)malloc(paraColumns * sizeof(int));}return  resultTwoDArray;}
void outputTwoDArray(towDArrayPtr paraPtr)
{int i,j;for(i = 0;i < paraPtr->rows;i ++){for(j = 0;j < paraPtr->columns;j ++){printf("%d ",paraPtr->elements[i][j]);} printf("\n");}printf("\r\n");
}

矩阵乘的函数实现

towDArrayPtr matrixMultiply(towDArrayPtr paraPtr1,towDArrayPtr paraPtr2)
{int i,j,k,sum;if(paraPtr1->columns != paraPtr2->rows){printf("这个两个矩阵不能相乘哦0.0\n");return ; }towDArrayPtr resultPtr;resultPtr = twoDArrayInit(paraPtr1->rows,paraPtr2->columns);for(i = 0;i < paraPtr1->rows;i ++)for(j = 0;j < paraPtr2->columns;j ++){sum = 0;for(k = 0;k < paraPtr1->columns;k ++){sum += paraPtr1->elements[i][k] * paraPtr2->elements[k][j]; }resultPtr->elements[i][j] = sum; }return resultPtr;
}
矩阵乘的函数实现

运行结果

压缩矩阵的转置

CompressedMatrixPtr initCompressedMatrix(int paraRows, int paraColumns, int paraElements, int **paraData) {int i;CompressedMatrixPtr resultPtr = (CompressedMatrixPtr)malloc(sizeof(struct CompressedMatrix));resultPtr->rows = paraRows; //行resultPtr->columns = paraColumns;  //列resultPtr->numElements = paraElements;resultPtr->elements = (TriplePtr)malloc(paraElements * sizeof(struct Triple));//压缩for (i = 0; i < paraElements; i ++) {resultPtr->elements[i].i = paraData[i][0];resultPtr->elements[i].j = paraData[i][1];resultPtr->elements[i].e = paraData[i][2];}return resultPtr;
}

压缩矩阵


CompressedMatrixPtr transposeCompressedMatrix(CompressedMatrixPtr paraPtr) {//Step 1. 申请空间int i, tempColumn, tempPosition;int *tempColumnCounts = (int *)malloc(paraPtr->columns * sizeof(int));int *tempOffsets = (int *)malloc(paraPtr->columns * sizeof(int));for (i = 0; i < paraPtr->columns; i ++) {tempColumnCounts[i] = 0;}CompressedMatrixPtr resultPtr = (CompressedMatrixPtr)malloc(sizeof(struct CompressedMatrix));//行列复值resultPtr->rows = paraPtr->columns;resultPtr->columns = paraPtr->rows;resultPtr->numElements = paraPtr->numElements;resultPtr->elements = (TriplePtr)malloc(paraPtr->numElements * sizeof(struct Triple));//扫描计算.for (i = 0; i < paraPtr->numElements; i ++) {tempColumnCounts[paraPtr->elements[i].j] ++;}tempOffsets[0] = 0;//从1开始一一增加for (i = 1; i < paraPtr->columns; i ++) {tempOffsets[i] = tempOffsets[i - 1] + tempColumnCounts[i - 1];printf("tempOffsets[%d] = %d \r\n", i, tempOffsets[i]);}//Step 3. 同样扫描另外一个for (i = 0; i < paraPtr->numElements; i ++) {tempColumn = paraPtr->elements[i].j;tempPosition = tempOffsets[tempColumn];resultPtr->elements[tempPosition].i = paraPtr->elements[i].j;resultPtr->elements[tempPosition].j = paraPtr->elements[i].i;resultPtr->elements[tempPosition].e = paraPtr->elements[i].e;tempOffsets[tempColumn]++;}//返回return resultPtr;
}

转置矩阵

void compressedMatrixTest() {CompressedMatrixPtr tempPtr1, tempPtr2;int i, j, tempElements;tempElements = 4;int **tempMatrix1 = (int **)malloc(tempElements * sizeof(int *));for (i = 0; i < tempElements; i ++) {tempMatrix1[i] = (int *)malloc(3 * sizeof(int));}int tempMatrix2[4][3] = {{0, 0, 2}, {0, 2, 3}, {2, 0, 5}, {2, 1, 6}};for (i = 0; i < tempElements; i ++) {for (j = 0; j < 3; j ++) {tempMatrix1[i][j] = tempMatrix2[i][j];}}tempPtr1 = initCompressedMatrix(2, 3, 4, tempMatrix1);printf("After initialization.\r\n");printCompressedMatrix(tempPtr1);tempPtr2 = transposeCompressedMatrix(tempPtr1);printf("After transpose.\r\n");printCompressedMatrix(tempPtr2);
}int main() {compressedMatrixTest();return 1;
}

测试代码

数据结构学习之矩阵乘法与矩阵的转置相关推荐

  1. lu分解法matlab_MIT 18.065—机器学习中的矩阵方法02 矩阵乘法与矩阵分解

    数据分析.信号处理和机器学习中的矩阵方法 第02讲 矩阵乘法与矩阵分解 新MIT 线性代数|机器学习(中英机翻字幕)18.065 by Gilbert Strang_哔哩哔哩 (゜-゜)つロ 干杯~- ...

  2. 二维矩阵乘法、矩阵转置、 矩阵与向量乘法(java实现)

    二维矩阵乘法.矩阵转置. 矩阵与向量乘法(java实现) 相关代码如下: package algorithms; //矩阵库 public class Matrisx { /***向量点相乘 doub ...

  3. matlab矩阵乘法结果出错,为啥矩阵乘法显示矩阵乘法维度不正确?是什么原因?...

    EDA365欢迎您登录! 您需要 登录 才可以下载或查看,没有帐号?注册 x 为啥矩阵乘法显示矩阵乘法维度不正确?是什么原因?代码如下: 7 ^$ @: y: ^, w) ^1 S # `/ S: I ...

  4. 疯子的算法总结(五) 矩阵乘法 (矩阵快速幂)

    学过线性代数的都知道矩阵的乘法,矩阵乘法条件第为一个矩阵的行数等与第二个矩阵的列数,乘法为第一个矩阵的第一行乘以第二个矩阵的第一列的对应元素的和作为结果矩阵的第一行第一列的元素.(详解参见线性代数) ...

  5. Vijos 1603 ----迷宫(矩阵乘法,矩阵快速幂)

    描述 在某个神秘的星球上有一个游乐园 游乐园里有一个奇怪的迷宫,迷宫内有n个点,每个点之间都可能会有一条有向边(可能会有自环) 现在游乐园主有个问题想请你帮忙: 问:从s点走到f点,恰好走过m条边(边 ...

  6. 矩阵问题入门(矩阵乘法and矩阵快速幂)acm寒假集训日记22/1/15

    今天凌晨3点才睡,没想到通过看小说抑制玩游戏,反而看小说的时间更长. u1s1:那小说太刺激了,晚上看很有感觉,风吹草动我就会猛地看过去(类似茄子说柜子动了,哈哈),真TM(语气词)练胆量!!!..Q ...

  7. strassen矩阵乘法 java_Strassen 矩阵算法 Java 实现

    展开全部 算法如下: //STRASSEN矩阵算法 #include const int N=8; //常量N用来定义矩阵的大小 void main() { void STRASSEN(int n,f ...

  8. numpy矩阵乘法_NumPy矩阵乘法

    numpy矩阵乘法 NumPy matrix multiplication can be done by the following three methods. NumPy矩阵乘法可以通过以下三种方 ...

  9. Java实现矩阵运算——矩阵乘法、矩阵转置、自动填充矩阵行

    在做大数据或人工智能开发的过程做难免会遇到矩阵运算,本文在这里给大家实现一个简单的矩阵运算,请看下代码: package test;/*** 矩阵运算* * @author Administrator ...

  10. 矩阵乘法,矩阵中各元素对应相乘及其梯度计算;

    矩阵乘法:x=([x1,x2]) w=([w1,w2],[w3,w4]) torch.matmul(x,w)=([x1w1+x2w3,x1w2+x2+w4]) x.grad=(w1+w2,w3+w4) ...

最新文章

  1. 令子元素垂直居中(并且子元素的高度不固定)
  2. 无监督分类:聚类分析(K均值)
  3. 2020蓝桥杯省赛---java---B---4( 合并检测)
  4. 哪些设计模式最值得学习
  5. (49)Xilinx Subtracter IP核配置(十)(第10天)
  6. Rad Controls_Q2_2006 注册机
  7. matlab连续时间系统复频域分析,实验五连续时间信号与系统的复频域分析的MATLAB实现.doc...
  8. ubuntu虚拟显示器远程连接桌面方案
  9. 集团企业数据信息系统建设方案
  10. 海量数据搜索——搜索引擎
  11. DTCC技术大会来了
  12. 2019年香港科大EMBA校友会年度盛会在珠海圆满落幕
  13. Weclome to Thm-V九维空间
  14. 嵌入式linux软件如何进行数据参数保存
  15. 掉入黑洞会怎样?被拉成面条,还是前往另一个宇宙?
  16. 什么是RS485总线?
  17. 大专生三面蚂蚁金服,工信部java工程师证书
  18. 基于opencv的身份证识别(KNN与OCR两种算法)
  19. 滤波算法、中值和均值滤波区别
  20. 一个例子彻底弄懂python中的break和continue语句(Python经典编程案例)

热门文章

  1. QT qml ListView 分页/翻页
  2. Mac系统MATLAB_R2018a软件CVX下载及安装
  3. ModifyStyle()的用法
  4. rpg人物制作软件_RPG Maker系列最新版本《RPG制作大师MZ》上架Steam
  5. 全国计算机二级vf成绩查询,2017全国计算机二级《VF》考点习题
  6. 虚拟服务器io,IO虚拟化:虚拟直接连接VMDc技术解析
  7. 计算机显示发送报告,Word文档打不开提示发送错误报告的解决方法
  8. linux内核无法识别声卡,伪输出,检测不到集成声卡
  9. 使用批处理文件删除所有子文件夹?
  10. VC中CDockablePane使用心得