【数组与链表算法】矩阵算法在程序中常见的简单应用 | C++

简介: 数组与链表都是相当重要的结构化数据类型,也都是典型线性表的应用。线性表用于计算机中的数据存储结构,按照内存存储的方式基本上可以分为以下两种:静态数据结构和动态数据结构。数组类型就是一种典型的静态数据结构,动态数据结构又称为链表。在我前面的算法系列文章都细致的对二者的使用方法做过讲解。

前言

       数组与链表都是相当重要的结构化数据类型,也都是典型线性表的应用。线性表用于计算机中的数据存储结构,按照内存存储的方式基本上可以分为以下两种:静态数据结构和动态数据结构。数组类型就是一种典型的静态数据结构,动态数据结构又称为链表。在我前面的算法系列文章都细致的对二者的使用方法做过讲解。

矩阵算法与深度学习

       从数学的角度来看,矩阵在计算机中是以二维数组的形式来展现的。在三维图形学中,矩阵也被经常性的使用,因为它可以表示模型数据的投影,扩大,缩小等三维运算。深度学习是目前相当热门的技术和话题,它与机器学习等技术类属于人工智能的一个分支,也是具有层次性的机器学习法。线性代数在深度学习中发挥了它强大的数学能力,在深度学习中我们常常用大量的矩阵运算来提高计算效率。在GPU(图形处理器)的内部,它就是以向量和矩阵元素为基础的,大量的矩阵运算可以分配给数众多的内核同步去进行处理,从而使人工智能领域进入更实用性的阶段。深度学习源自于类神经网络模型,它结合了大量的运算资源和神经网络框架,让机器像人类大脑那样通过大量的数据信息来进行神经网络化的深度学习。就像前几年的人工智能围棋程序AlphaGo就展现出了它的强大生命力。

一、矩阵相加

1.具体情况

       矩阵的相加运算较为简单,前提是相加的几个矩阵具有相同的行列数,从而相加后的结果矩阵与原来矩阵的行列数也是相同的。具体如下图所示:

2.范例程序:用程序代码对随机输入的两个矩阵进行相加。

3.代码展示:

#include<iostream>
using namespace std;
#define row 4   //事先声明矩阵的行数
#define col 4 //事先声明矩阵的列数
class matrix {
public:
  int A[row][col];
  int B[row][col];
  int record[row][col];
  void matrix_add() {
  for (int i = 0; i < row; i++)
    for (int j = 0; j < col; j++)
    record[i][j] = A[i][j] + B[i][j];
  }
  void showresult() {
  cout << "两矩阵相加之和如下" << endl;
  for (int i = 0; i < row; i++) {
    for (int j = 0; j < col; j++) {
    cout << record[i][j] << " ";
    }
    cout << endl;
  }
  }
};
void text()
{
  matrix m;
  cout << "请输入矩阵A" << endl;
  for (int i = 0; i < row; i++)
  for (int j = 0; j < col; j++)
    cin >> m.A[i][j];
  cout << "请输入矩阵B" << endl;
  for (int i = 0; i < row; i++)
  for (int j = 0; j < col; j++)
    cin >> m.B[i][j];
  m.matrix_add();
  m.showresult();
}
int main()
{
  text();
}

4.结果展示:


、矩阵相乘

1.具体情况

       两个矩阵A与B的相乘受到了一些条件的限制。首先必须符合A为一个m×n的矩阵,B为一个n×p的矩阵,A×B后的结果成为一个m×p的矩阵C,具体如下图所示:


2.范例程序:用程序代码去实现三个随机输入矩阵的相乘。

3.代码展示:

#include<iostream>
using namespace std;
#define row 3   //事先声明矩阵的行数
#define col 3 //事先声明矩阵的列数
class matrix {
public:
  int A[row][col];
  int B[row][col];
  int C[row][col];
  int record[row][col];
  int sum;
  void matrix_mul() {
  for (int i = 0; i < row; i++) {
    for (int j = 0; j < col; j++) {
    int m = 0,n=0;
    record[i][j]=A[i][m] * B[n][j] + A[i][m+1] * B[n+1][j] + A[i][m+2] * B[n+2][j];
    }
  }
  for (int i = 0; i < row; i++) {
    for (int j = 0; j < col; j++) {
    int m = 0, n = 0;
    record[i][j] = record[i][m] * C[n][j] + record[i][m+1] * C[n+1][j] + record[i][m+2] * C[n+2][j];
    }
  }
  }
  void showresult() {
  cout << "三矩阵相乘结果如下" << endl;
  for (int i = 0; i < row; i++) {
    for (int j = 0; j < col; j++) {
    cout << record[i][j] << " ";
    }
    cout << endl;
  }
  }
};
void text()
{
  matrix m;
  cout << "请输入矩阵A" << endl;
  for (int i = 0; i < row; i++)
  for (int j = 0; j < col; j++)
    cin >> m.A[i][j];
  cout << "请输入矩阵B" << endl;
  for (int i = 0; i < row; i++)
  for (int j = 0; j < col; j++)
    cin >> m.B[i][j];
  cout << "请输入矩阵C" << endl;
  for (int i = 0; i < row; i++)
  for (int j = 0; j < col; j++)
    cin >> m.C[i][j];
  m.matrix_mul();
  m.showresult();
}
int main()
{
  text();
}

4.结果展示:

、矩阵转置

1.具体情况

       转置矩阵就是把原矩阵的行坐标元素与列坐标元素进行相互调换。具体如下图所示:



2.范例程序:用程序代码去输出随机输入矩阵的转置矩阵。

3.代码展示:

#include<iostream>
using namespace std;
#define row 4   //事先声明矩阵的行数
#define col 4 //事先声明矩阵的列数
class matrix {
public:
  int A[row][col];
  int record[row][col];
  void matrix_tran() {
  for (int i = 0; i < row; i++) {
    for (int j = 0; j < col; j++) {
    record[j][i] = A[i][j];
    }
  }
  }
  void showresult() {
  cout << "输入矩阵的转置结果如下" << endl;
  for (int i = 0; i < row; i++) {
    for (int j = 0; j < col; j++) {
    cout << record[i][j] << " ";
    }
    cout << endl;
  }
  }
};
void text()
{
  matrix m;
  cout << "请输入矩阵" << endl;
  for (int i = 0; i < row; i++)
  for (int j = 0; j < col; j++)
    cin >> m.A[i][j];
  m.matrix_tran();
  m.showresult();
}
int main()
{
  text();
}

4.结果展示:

、稀疏矩阵

1.具体情况

       稀疏矩阵就是指一个矩阵中的大部分元素为0的一种特殊矩阵。因为稀疏矩阵中大部分元素都是0,所以实际存储的数据项少,如果在计算机中以传统的方式来存储稀疏矩阵,就会浪费极大的计算机内存。在这里将会用到三项式型的数据结构来存储稀疏矩阵,其中A(0,1):表示该稀疏矩阵的行数;A(0,2):表示该稀疏矩阵的列数;A(0,3):表示此稀疏矩阵中非零项的总数;另外,每一个非零项以(i,j,item-value)来表示。其中i表示此矩阵中非零项所在的行数,j表示非零项所在的列数,item-value表示该非零项的值。具体情况如下图所示:


2.范例程序:用程序代码去输出一个随机输入稀疏矩阵的三项式下的压缩结果。

3.代码展示:

#include<iostream>
using namespace std;
#define row 8   //稀疏矩阵的行数
#define col 9 //稀疏矩阵的列数
#define notzero 8   //稀疏矩阵中不为0的数据个数
class matrix {
public:
  int sparse[row][col];   
  int compress[notzero][3];
  void matrix_sparse() {
  compress[0][0] = row;
  compress[0][1] = col;
  compress[0][2] = notzero;
  cout << "三项式下矩阵的压缩结果如下" << endl;
  cout << compress[0][0] << " " << compress[0][1] << " " << compress[0][2] << endl;
  for (int i = 0,k=1; i < row; i++,k++) {
    int m = 0;
    for (int j = 0; j < col; j++) {
    if (sparse[i][j] != 0)
    {
      compress[k][m] = i;
      compress[k][m + 1] = j;
      compress[k][m + 2] = sparse[i][j];
      cout << compress[k][m] <<" "<< compress[k][m + 1] <<" "<< compress[k][m + 2] << endl;
    }
    }
  }
  }
};
void text()
{
  matrix m;
  cout << "请输入稀疏矩阵" << endl;
  for (int i = 0; i < row; i++)
  for (int j = 0; j < col; j++)
    cin >> m.sparse[i][j];
  m.matrix_sparse();
}
int main()
{
  text();
}

总结

       矩阵是高等代数学中的常见工具,在物理学,计算机科学等等的领域它都有着非常重要的应用。在上面我们只介绍了一些简单的矩阵运算实例,其实矩阵的运算和矩阵的类别有很多很多,它们都可以尝试用代码在程序中进行模拟实现。


目录
相关文章
|
11月前
|
存储 监控 算法
基于 C++ 哈希表算法实现局域网监控电脑屏幕的数据加速机制研究
企业网络安全与办公管理需求日益复杂的学术语境下,局域网监控电脑屏幕作为保障信息安全、规范员工操作的重要手段,已然成为网络安全领域的关键研究对象。其作用类似网络空间中的 “电子眼”,实时捕获每台电脑屏幕上的操作动态。然而,面对海量监控数据,实现高效数据存储与快速检索,已成为提升监控系统性能的核心挑战。本文聚焦于 C++ 语言中的哈希表算法,深入探究其如何成为局域网监控电脑屏幕数据处理的 “加速引擎”,并通过详尽的代码示例,展现其强大功能与应用价值。
227 2
|
存储 负载均衡 算法
基于 C++ 语言的迪杰斯特拉算法在局域网计算机管理中的应用剖析
在局域网计算机管理中,迪杰斯特拉算法用于优化网络路径、分配资源和定位故障节点,确保高效稳定的网络环境。该算法通过计算最短路径,提升数据传输速率与稳定性,实现负载均衡并快速排除故障。C++代码示例展示了其在网络模拟中的应用,为企业信息化建设提供有力支持。
364 15
|
存储 算法 数据处理
公司局域网管理中的哈希表查找优化 C++ 算法探究
在数字化办公环境中,公司局域网管理至关重要。哈希表作为一种高效的数据结构,通过哈希函数将关键值(如IP地址、账号)映射到数组索引,实现快速的插入、删除与查找操作。例如,在员工登录验证和设备信息管理中,哈希表能显著提升效率,避免传统线性查找的低效问题。本文以C++为例,展示了哈希表在局域网管理中的具体应用,包括设备MAC地址与IP分配的存储与查询,并探讨了优化哈希函数和扩容策略,确保网络管理高效准确。
|
7月前
|
存储 算法 生物认证
基于Zhang-Suen算法的图像细化处理FPGA实现,包含testbench和matlab验证程序
本项目基于Zhang-Suen算法实现图像细化处理,支持FPGA与MATLAB双平台验证。通过对比,FPGA细化效果与MATLAB一致,可有效减少图像数据量,便于后续识别与矢量化处理。算法适用于字符识别、指纹识别等领域,配套完整仿真代码及操作说明。
|
10月前
|
PyTorch 算法框架/工具 C++
人工智能算法python程序运行环境安装步骤整理
本教程详细介绍Python与AI开发环境的配置步骤,涵盖软件下载、VS2017安装、Anaconda配置、PyCharm设置及组件安装等内容,适用于Windows系统,助你快速搭建开发环境。
|
11月前
|
监控 算法 数据处理
基于 C++ 的 KD 树算法在监控局域网屏幕中的理论剖析与工程实践研究
本文探讨了KD树在局域网屏幕监控中的应用,通过C++实现其构建与查询功能,显著提升多维数据处理效率。KD树作为一种二叉空间划分结构,适用于屏幕图像特征匹配、异常画面检测及数据压缩传输优化等场景。相比传统方法,基于KD树的方案检索效率提升2-3个数量级,但高维数据退化和动态更新等问题仍需进一步研究。未来可通过融合其他数据结构、引入深度学习及开发增量式更新算法等方式优化性能。
283 17
|
9月前
|
存储 监控 算法
基于跳表数据结构的企业局域网监控异常连接实时检测 C++ 算法研究
跳表(Skip List)是一种基于概率的数据结构,适用于企业局域网监控中海量连接记录的高效处理。其通过多层索引机制实现快速查找、插入和删除操作,时间复杂度为 $O(\log n)$,优于链表和平衡树。跳表在异常连接识别、黑名单管理和历史记录溯源等场景中表现出色,具备实现简单、支持范围查询等优势,是企业网络监控中动态数据管理的理想选择。
248 0
|
10月前
|
机器学习/深度学习 存储 算法
基于 C++ 布隆过滤器算法的局域网上网行为控制:URL 访问过滤的高效实现研究
本文探讨了一种基于布隆过滤器的局域网上网行为控制方法,旨在解决传统黑白名单机制在处理海量URL数据时存储与查询效率低的问题。通过C++实现URL访问过滤功能,实验表明该方法可将内存占用降至传统方案的八分之一,查询速度提升约40%,假阳性率可控。研究为优化企业网络管理提供了新思路,并提出结合机器学习、改进哈希函数及分布式协同等未来优化方向。
297 0
|
存储 监控 算法
基于 C++ 哈希表算法的局域网如何监控电脑技术解析
当代数字化办公与生活环境中,局域网的广泛应用极大地提升了信息交互的效率与便捷性。然而,出于网络安全管理、资源合理分配以及合规性要求等多方面的考量,对局域网内计算机进行有效监控成为一项至关重要的任务。实现局域网内计算机监控,涉及多种数据结构与算法的运用。本文聚焦于 C++ 编程语言中的哈希表算法,深入探讨其在局域网计算机监控场景中的应用,并通过详尽的代码示例进行阐释。
258 4
|
存储 算法 安全
企业员工数据泄露防范策略:基于 C++ 语言的布隆过滤器算法剖析[如何防止员工泄密]
企业运营过程中,防范员工泄密是信息安全领域的核心议题。员工泄密可能致使企业核心数据、商业机密等关键资产的流失,进而给企业造成严重损失。为应对这一挑战,借助恰当的数据结构与算法成为强化信息防护的有效路径。本文专注于 C++ 语言中的布隆过滤器算法,深入探究其在防范员工泄密场景中的应用。
278 8