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

目录

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

矩阵相加

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.hqwc.cn/news/151796.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hadoop分布式安装

首先准备好三台服务器或者虚拟机&#xff0c;我本机安装了三个虚拟机&#xff0c;安装虚拟机的步骤参考我之前的一篇 virtualBox虚拟机安装多个主机访问虚拟机虚拟机访问外网配置-CSDN博客 jdk安装 参考文档&#xff1a;Linux 环境下安装JDK1.8并配置环境变量_linux安装jdk1.8并…

城市群(Megalopolis)/城际(inter-city)OD相关研究即Open Access数据集调研

文章目录 1 城市群/城际OD定义2 理论模型与分析方法2.1 重力模型 Gravity Model2.2 干预机会模型 Intervening Opportunities Model2.3 辐射模型 Radiation Model 3 Issues related to OD flows3.1 OD Prediction3.2 OD Forecasting3.3 OD Construction3.4 OD Estimation 4 OD …

C/C++数据结构之深入了解树与二叉树:概念、存储结构和遍历

树是一种常见的数据结构&#xff0c;它在计算机科学和数学中都有广泛的应用。树结构的最简单形式是二叉树&#xff0c;本文将深入探讨树和二叉树的概念、存储结构以及二叉树的遍历&#xff0c;并提供一些实际的代码示例来帮助理解这些概念。 树与二叉树的概念 树 (Tree) 树是…

雷电_安卓模拟器安装burpsuit_CA证书

雷电_安卓模拟器安装burpsuit_CA证书 文章目录 雷电_安卓模拟器安装burpsuit_CA证书雷电模拟器官网&#xff1a;https://www.ldmnq.com 安装burpsuit证书1 打开雷电模拟器右上角的winfi图标 -->点击齿轮2 修改网络3 选择高级 —》手动4 查看真实机IP的地址&#xff0c;选择虚…

为什么多线程会带来性能问题?

为什么多线程会带来性能问题&#xff1f; 什么是性能问题 在上一篇中&#xff0c;我们已经学习了多线程带来的线程安全问题&#xff0c;但对于多线程而言&#xff0c;它不仅可能会带来线程安全问题&#xff0c;还有可能会带来性能问题&#xff0c;也许你会奇怪&#xff0c;我…

刚刚:腾讯云3年轻量2核2G4M服务器优惠价格366元三年

腾讯云3年轻量2核2G4M服务器&#xff0c;2023双十一优惠价格366元三年&#xff0c;自带4M公网带宽&#xff0c;下载速度可达512KB/秒&#xff0c;300GB月流量&#xff0c;50GB SSD盘系统盘&#xff0c;腾讯云百科txybk.com分享腾讯云轻量2核2G4M服务器性能、优惠活动、购买条件…

mac vscode 使用 clangd

C 的智能提示 IntelliSense 非常不准&#xff0c;我们可以使用 clangd clangd 缺点就是配置繁琐&#xff0c;优点就是跳转和提示代码精准 开启 clangd 之后会提示你关闭 IntelliSense 1、安装插件 clangd 搜索第一个下载多的就是 2、配置 clangd 可执行程序路径 clangd 插…

react实现步进器

创建一个步进器组件&#xff0c;包含当前步骤&#xff08;currentStep&#xff09;的状态以及前进和后退的操作&#xff1a; import React, { useState } from react;function Stepper() {const [currentStep, setCurrentStep] useState(1);const handleNext () > {setCu…

环形链表(C++解法)

题目 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置&#…

如何能够在发现问题和提问的时候一并带出自己的解决方案

1. 充分理解问题&#xff1a; 在提出问题之前&#xff0c;确保你已经完全理解了问题的本质。从不同的角度分析问题&#xff0c;确保没有遗漏任何重要的信息或者上下文。 2. 进行自我调查和研究&#xff1a; 在向他人寻求帮助之前&#xff0c;尝试自己解决问题。利用网络资源…

【proteus】8086 写一个汇编程序并调试

参考书籍&#xff1a;微机原理与接口技术——基于8086和Proteus仿真&#xff08;第3版&#xff09;p103-105&#xff0c;p119-122. 参考程序是p70&#xff0c;例4-1 在上一篇的基础上&#xff1a; 创建项目和汇编文件 写一个汇编程序并编译 双击8086的元件图&#xff1a; …

数据结构和算法——用C语言实现所有排序算法

文章目录 前言排序算法的基本概念内部排序插入排序直接插入排序折半插入排序希尔排序 交换排序冒泡排序快速排序 选择排序简单选择排序堆排序 归并排序基数排序 外部排序多路归并败者树置换——选择排序最佳归并树 前言 本文所有代码均在仓库中&#xff0c;这是一个完整的由纯…