数组与链表算法-矩阵算法

news/2025/2/22 6:04:29/

目录

 数组与链表算法-矩阵算法

矩阵相加

C++代码

矩阵相乘

C++代码

转置矩阵

C++代码

稀疏矩阵

C++代码


 数组与链表算法-矩阵算法

矩阵相加

矩阵的相加运算较为简单,前提是相加的两个矩阵对应的行数与列数必须相等,而相加后矩阵的行数与列数也是相同的。【

C++代码

#include<iostream>
using namespace std;void MaterixAdd(int* arrA, int* arrB, int* arrC, int dimX, int dimY) {if (dimX <= 0 || dimY <= 0) {cout << "矩阵维数必须大于0" << endl;return;}for (int row = 0; row < dimX; row++) {for (int col = 0; col < dimY; col++) {arrC[row * dimX + col] = arrA[row * dimX + col] + arrB[row * dimX + col];}}
}void PrintArr(int* arr, int dimX, int dimY) {for (int i = 0; i < dimX; i++) {for (int j = 0; j < dimY; j++) {cout << arr[i * dimX + j] << "\t";}cout << endl;}
}int main() {const int Row = 3;const int Col = 3;int A[Row][Col] = { {1,3,5},{7,9,11},{13,15,17} };int B[Row][Col] = { {9,8,7},{6,5,4},{3,2,1} };int C[Row][Col] = { 0 };cout << "矩阵A的各个元素:" << endl;PrintArr(&A[0][0], Row, Col);cout << "矩阵B的各个元素:" << endl;PrintArr(&B[0][0], Row, Col);MaterixAdd(&A[0][0], &B[0][0], &C[0][0], Row, Col);cout << "矩阵C的各个元素:" << endl;PrintArr(&C[0][0], Row, Col);return 0;
}

输出结果

 

 

矩阵相乘

两个矩阵A和B的相乘受到某些条件的限制。首先,必须符合A为一个m\times n的矩阵,B为一个n\times p的矩阵,A\times B之后的结果为一个m\times p的矩阵C。

C++代码

#include<iostream>
using namespace std;void MaterixMultiply(int* arrA, int* arrB, int* arrC, int dimX, int dimY) {if (dimX <= 0 || dimY <= 0) {cout << "矩阵维数必须大于0" << endl;return;}for (int i = 0; i < dimX; i++) {for (int j = 0; j < dimX; j++) {int Temp = 0;for(int k = 0;k< dimY;k++){arrC[i * dimX + j] += (arrA[i * dimY + k] * arrB[k * dimX + j]);}}}
}void PrintArr(int* arr, int dimX, int dimY) {for (int i = 0; i < dimX; i++) {for (int j = 0; j < dimY; j++) {cout << arr[i * dimY + j] << "\t";}cout << endl;}
}int main() {const int Row = 2;const int Col = 3;int A[Row][Col] = { {1,2,3},{4,5,6} };int B[Col][Row] = { {3,4},{6,1},{2,7} };int C[Row][Row] = { 0 };cout << "矩阵A的各个元素:" << endl;PrintArr(&A[0][0], Row, Col);cout << "矩阵B的各个元素:" << endl;PrintArr(&B[0][0], Col, Row);MaterixMultiply(&A[0][0], &B[0][0], &C[0][0], Row, Col);cout << "矩阵C的各个元素:" << endl;PrintArr(&C[0][0], Row, Row);return 0;
}

输出结果

转置矩阵

转置矩阵(A^{t})就是把原矩阵的行坐标元素与列坐标元素相互调换。假设A^{t}A的转置矩阵,则有A^{t}[j,i] = A[i,j]

C++代码

#include<iostream>
using namespace std;void MaterixTranspose(int* arr, int dimX, int dimY) {for (int i = 0; i < dimX; i++) {for (int j = 0; j <= i; j++) {int Temp = arr[i * dimY + j];arr[i * dimY + j] = arr[j * dimY + i];arr[j * dimY + i] = Temp;}}
}void PrintArr(int* arr, int dimX, int dimY) {for (int i = 0; i < dimX; i++) {for (int j = 0; j < dimY; j++)cout << arr[i * dimY + j] << "\t";cout << endl;}
}int main() {const int Row = 3;const int Col = 3;int arr[Row][Col] = { {1,2,3},{4,5,6},{7,8,9} };cout << "原始矩阵:" << endl;PrintArr(&arr[0][0], Row, Col);MaterixTranspose(&arr[0][0], Row, Col);cout << "转置矩阵:" << endl;PrintArr(&arr[0][0], Row, Col);return 0;
}

输出结果

稀疏矩阵

稀疏矩阵(Sparse Matrix)就是指一个矩阵中的大部分元素为0。对于稀疏矩阵而言,因为矩阵中的许多元素都是0,所以实际存储的数据项很少,如果在计算机中使用传统的二维数组方式来存储稀疏矩阵,就十分浪费计算机的内存空间。

提高内存空间利用率的方法是使用三项式(3-Tuple)的数据结构。我们把每一个非零项用(i, j, item-value)的形式来表示,假如一个稀疏矩阵有n个非零项,那么可以使用一个A(0:n, 1:3)的二维数组来存储这些非零项。

其中,A(0, 1)存储这个稀疏矩阵的行数,A(0,2)存储这个稀疏矩阵的列数,而A(0,3)则存储这个稀疏矩阵非零项的总数。另外,每一个非零项以(i, j, item-value)来表示。其中i为此矩阵非零项所在的行数,j为此矩阵非零项所在的列数,item-value则为此矩阵非零项的值。

A(0, 1):表示此矩阵的行数。

A(0, 2):表示此矩阵的列数。

A(0, 3):表示此矩阵非零项的总数。

这种利用3项式数据结构来压缩稀疏矩阵的方式可以减少对内存的浪费。

C++代码

#include<iostream>
using namespace std;void MaterixSparse(int* arrSparse, int* arrCompress, int dimX, int dimY) {int temp = 1;for (int i = 0; i < dimX; i++) {for (int j = 0; j < dimY; j++) {if (arrSparse[i * dimY + j] != 0) {arrCompress[temp * 3 + 0] = i;arrCompress[temp * 3 + 1] = j;arrCompress[temp * 3 + 2] = arrSparse[i * dimY + j];temp++;}}}
}void PrintArr(int* arr, int dimX, int dimY) {for (int i = 0; i < dimX; i++) {for (int j = 0; j < dimY; j++)cout << arr[i * dimY + j] << "\t";cout << endl;}
}int main() {const int Row = 8;const int Col = 9;const int NotZero = 8;int Sparse[Row][Col] = { {0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0},{0,0,0,0,7,0,0,0,0},{0,0,0,0,0,0,0,0,5}, {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0}, {0,0,6,1,8,0,0,0,2}, {4,0,0,0,0,0,3,0,0} };int Compress[NotZero + 1][3]{ 0 };Compress[0][0] = Row;Compress[0][1] = Col;Compress[0][2] = NotZero;cout << "稀疏矩阵:" << endl;PrintArr(&Sparse[0][0], Row, Col);MaterixSparse(&Sparse[0][0], &Compress[0][0], Row, Col);cout << "压缩矩阵:" << endl;PrintArr(&Compress[0][0], NotZero + 1, 3);return 0;
}

输出结果


http://www.ppmy.cn/news/1182491.html

相关文章

有一个带头结点的单链表L,设计一个算法使其元素递增有序

有一个带头结点的单链表L&#xff0c;设计一个算法使其元素递增有序 代码思路&#xff1a; 我这里懒得搞那个指针了&#xff0c;直接遍历一遍链表&#xff0c;把链表的元素复制到数组arr里面 对数组A进行一下排序&#xff0c;排完之后再把元素复制到L里面。 至于排序你用啥算…

S32K144芯片焊接完成后使用S32DS初次下载无法下载解决方法

一、问题现象如下&#xff0c;S32DS Debug下报错 二、原因&#xff0c;原厂芯片出厂时的FLASH Memory的安全机制是激活的&#xff0c;仿真器是可以连上&#xff0c;但是没法读取Flash Memory的内容 三、解决方法 参考图示&#xff0c;解锁后即可正常Debug

【Qt之QMapIterator】检测是否为空

简介 QMapIterator及其他类型迭代器&#xff0c;本身没有一个直接的方式来判断是否为空&#xff0c;因为它不是一个容器&#xff0c;而是一个迭代器&#xff0c;用来遍历容器&#xff08;如QMap&#xff09;的元素。 然而&#xff0c;可以通过检查它是否还有下一个元素来判断…

【51单片机】51单片机概述(学习笔记)

一、课程简介 1、硬件设备 51单片机开发板 Win电脑 2、软件设备 Keil5&#xff1a;编写程序代码 STC-ISP&#xff1a;下载程序 有道词典 福昕阅读器 二、开发工具介绍 1、Keil5 keil.com > 下载C51版本 > 使用破解程序 2、STC-ISP 绿色版&#xff1a;直接运…

react高阶成分(HOC)例子效果

使用React函数式组件写了一个身份验证的一个功能&#xff0c;示例通过高阶组件实现的一个效果展示&#xff1a; import React, { useState, useEffect } from react;// 定义一个高阶组件&#xff0c;它接受一个组件作为输入&#xff0c;并返回一个新的包装组件 const withAuth…

Redis缓存击穿、雪崩、穿透

缓存击穿 我们通过对数据库的数据进行查询后在redis中缓存&#xff0c;但是在高并发环境下&#xff0c;某个保存的key值在失效的瞬间被大量并发请求访问&#xff0c;这些持续的大并发量就会穿破缓存&#xff0c;直接请求数据库&#xff0c;会对数据库造成巨大压力&#xff0c;…

Proteus仿真--闪烁的LED灯

本文介绍一种基于51单片机实现的LED灯闪烁仿真&#xff08;完整仿真源文件及代码见文末链接&#xff09; 本文主要介绍51单片机的LED闪烁仿真设计&#xff0c;仿真文件截图如下&#xff1a; 仿真视频如下&#xff1a; Proteus仿真--闪烁的LED灯 附完整Proteus仿真资料代码资…

EASEX绘制卡通头像

#include <stdio.h> #include <easyx.h> #include <iostream> #include <math.h> #define PI 3.14 // 1PI 180度 2PI 360度int main() {// 创建1024*1024的窗体initgraph(1024, 1024);// 将背景颜色设施为白色setbkcolor(WHITE);cleardevice();// to…