【数据结构】数组和字符串(二):特殊矩阵的压缩存储:对角矩阵——一维数组

news2024/9/27 19:21:29

文章目录

  • 4.2.1 矩阵的数组表示
  • 4.2.2 特殊矩阵的压缩存储
    • a. 对角矩阵的压缩存储
      • 结构体
      • 初始化
      • 元素设置
      • 元素获取
      • 打印矩阵
      • 主函数
      • 输出结果
      • 代码整合

4.2.1 矩阵的数组表示

【数据结构】数组和字符串(一):矩阵的数组表示

4.2.2 特殊矩阵的压缩存储

  矩阵是以按行优先次序将所有矩阵元素存放在一个一维数组中。但是对于特殊矩阵,如对称矩阵、三角矩阵、对角矩阵和稀疏矩阵等, 如果用这种方式存储,会出现大量存储空间存放重复信息或零元素的情况,这样会造成很大的空间浪费。为节约存储空间和算法(程序)运行时间,通常会采用压缩存储的方法。

  • 对角矩阵:指除了主对角线以外的元素都为零的矩阵,即对 任意 i ≠ j (1≤ i , j ≤n),都有M(i, j)=0。由于只有主对角线上有非零元素,只需存储主对角线上的元素即可。
  • 三角矩阵:指上三角或下三角的元素都为零的矩阵。同样地,只需存储其中一部分非零元素,可以节省存储空间。
  • 对称矩阵:指矩阵中的元素关于主对角线对称的矩阵。由于对称矩阵的非零元素有一定的规律,可以只存储其中一部分元素,从而减少存储空间。
  • 稀疏矩阵:指大部分元素为零的矩阵。传统的按行优先次序存储方法会浪费大量空间来存储零元素,因此采用压缩存储的方法更为合适。常见的压缩存储方法有:压缩稠密行(CSR)、压缩稠密列(CSC)、坐标列表(COO)等。

a. 对角矩阵的压缩存储

  对于一个n×n维的对角矩阵M,由于非主对角线上的元素都为零,只需存储其n个对角元素的值即可。可以使用一维数组d[n]来压缩存储对角矩阵,其中d[i-1] (1≤ i ≤ n)存储M(i, i)的值。这种压缩存储方式可以显著减少存储空间的使用量,尤其在矩阵规模较大时效果更为明显。同时,在对角矩阵的运算中,由于非主对角线上的元素都为零,可以通过直接访问压缩后的数据来提高算法的效率。

结构体

typedef struct {
    int size;       // 矩阵的维度
    int diagonal[MAX_SIZE];  // 存储对角元素的数组
} DiagonalMatrix;

   DiagonalMatrix 结构体定义了对角矩阵的结构,包括矩阵的维度 size 和存储对角元素的数组 diagonal

初始化

void initialize(DiagonalMatrix *matrix, int size) {
    matrix->size = size;

    // 初始化对角元素数组
    for (int i = 0; i < size; i++) {
        matrix->diagonal[i] = 0;
    }
}

  initialize 函数用于初始化对角矩阵,接受一个指向 DiagonalMatrix 结构体的指针和矩阵的维度作为参数,在函数内部将矩阵的维度存储到 size 成员变量中,并将对角元素数组的所有元素初始化为0。

元素设置

void setElement(DiagonalMatrix *matrix, int row, int col, int value) {
    if (row != col) {
        printf("Error: Only diagonal elements can be set.\n");
    } else if (row < 0 || row >= matrix->size || col < 0 || col >= matrix->size) {
        printf("Error: Invalid row or column index.\n");
    } else {
        matrix->diagonal[row] = value;
    }
}

  setElement 函数用于设置对角矩阵中指定位置的元素值,接受一个指向 DiagonalMatrix 结构体的指针、行索引、列索引和要设置的值作为参数。

  • 函数首先检查行索引和列索引是否相等,因为只有对角线上的元素可以被设置。
  • 检查行索引和列索引是否有效,即在矩阵范围内。
  • 如果通过了检查,将指定位置的对角元素设置为给定的值。

元素获取

int getElement(DiagonalMatrix *matrix, int row, int col) {
    if (row < 0 || row >= matrix->size || col < 0 || col >= matrix->size) {
        printf("Error: Invalid row or column index.\n");
        return 0;
    } else if (row != col) {
        return 0;
    } else {
        return matrix->diagonal[row];
    }
}

  getElement 函数用于获取对角矩阵中指定位置的元素值,接受一个指向 DiagonalMatrix 结构体的指针、行索引和列索引作为参数。

  • 函数首先检查行索引和列索引是否有效,如果无效则打印错误信息并返回0。、
  • 然后再次检查行索引和列索引是否相等,如果不相等则表示该位置不是对角元素,返回0。
  • 如果通过了检查,返回指定位置的对角元素的值。

打印矩阵

void printMatrix(DiagonalMatrix *matrix) {
    for (int i = 0; i < matrix->size; i++) {
        for (int j = 0; j < matrix->size; j++) {
            printf("%d ", getElement(matrix,i,j));
        }
        printf("\n");
    }
}

  printMatrix 函数用于打印对角矩阵,接受一个指向 DiagonalMatrix 结构体的指针作为参数。函数通过两层循环遍历矩阵的每个位置,调用getElement 函数获取并打印元素的值。

主函数

int main() {
    DiagonalMatrix matrix;
    int size = 6;

    initialize(&matrix, size);
    // 读入数据并设置对角矩阵的元素
    for (int i = 0; i < size; i++) {
        int value;
        printf("\nEnter the value for element [%d][%d]: ", i, i);
        scanf("%d", &value);
        setElement(&matrix, i, i, value);
    }

    printf("Diagonal Matrix:\n");
    printMatrix(&matrix);
    return 0;
}

  在 main 函数中,首先定义了一个 DiagonalMatrix 类型的变量 matrix 和一个整数变量 size。然后调用 initialize 函数初始化矩阵,将矩阵的维度设置为4,并将对角元素分别设置为1、2、3和4。最后使用 printMatrix 函数打印矩阵。

输出结果

在这里插入图片描述

代码整合

#include <stdio.h>

#define MAX_SIZE 100

// 定义对角矩阵结构体
typedef struct {
    int size;       // 矩阵的维度
    int diagonal[MAX_SIZE];  // 存储对角元素的数组
} DiagonalMatrix;

// 初始化对角矩阵
void initialize(DiagonalMatrix *matrix, int size) {
    matrix->size = size;

    // 初始化对角元素数组
    for (int i = 0; i < size; i++) {
        matrix->diagonal[i] = 0;
    }
}

// 设置对角矩阵中指定位置的元素值
void setElement(DiagonalMatrix *matrix, int row, int col, int value) {
    if (row != col) {
        printf("Error: Only diagonal elements can be set.\n");
    } else if (row < 0 || row >= matrix->size || col < 0 || col >= matrix->size) {
        printf("Error: Invalid row or column index.\n");
    } else {
        matrix->diagonal[row] = value;
    }
}

// 获取对角矩阵中指定位置的元素值
int getElement(DiagonalMatrix *matrix, int row, int col) {
    if (row < 0 || row >= matrix->size || col < 0 || col >= matrix->size) {
        printf("Error: Invalid row or column index.\n");
        return 0;
    } else if (row != col) {
        return 0;
    } else {
        return matrix->diagonal[row];
    }
}

// 打印对角矩阵
void printMatrix(DiagonalMatrix *matrix) {
    for (int i = 0; i < matrix->size; i++) {
        for (int j = 0; j < matrix->size; j++) {
            printf("%d ", getElement(matrix,i,j));
        }
        printf("\n");
    }
}

int main() {
    DiagonalMatrix matrix;
    int size = 6;

    initialize(&matrix, size);
    // 读入数据并设置对角矩阵的元素
    for (int i = 0; i < size; i++) {
        int value;
        printf("\nEnter the value for element [%d][%d]: ", i, i);
        scanf("%d", &value);
        setElement(&matrix, i, i, value);
    }

    printf("Diagonal Matrix:\n");
    printMatrix(&matrix);
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1130555.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Qt之普通项目如何生成DLL(含源码+注释)

文章目录 一、示例图二、普通项目需要改造的内容三、源码&#xff08;创建了一个TestDLL的项目&#xff0c;更改内容主要在pro文件和maindow.h文件&#xff09;TestDLL.promainwindow.hmainwindow.cppmainwindow.ui 总结 一、示例图 使用不同的编译模式编译&#xff0c;会在对…

卷积神经网络的感受野

经典目标检测和最新目标跟踪都用到了RPN(region proposal network)&#xff0c;锚框(anchor)是RPN的基础&#xff0c;感受野(receptive field, RF)是anchor的基础。本文介绍感受野及其计算方法&#xff0c;和有效感受野概念。 1.感受野概念 在典型CNN结构中&#xff0c;FC层(…

一款集成了主流大语言模型以及绘图模型的 APP, 采用 Flutter 开发,代码完全开源!!

一款集成了主流大语言模型以及绘图模型的 APP&#xff0c; 采用 Flutter 开发&#xff0c;代码完全开源&#xff0c;支持以下功能&#xff1a; 支持 OpenAI 的 GPT-3.5&#xff0c;GPT-4 大语言模型支持 Anthropic 的 Claude instant&#xff0c;Claude 2.0 大语言模型支持国产…

Python 框架学习 Django篇 (六) 数据表关联、ORM关联

在后端服务器开发中&#xff0c;特别是前后端分离的架构中数据库是非常重要的&#xff0c;后端主要就是负责管理数据&#xff0c;而我们经常使用的mysql、oracle 都是关系型数据库&#xff0c;什么是关系型数据库&#xff1f;就是建立在关系模型基础上的数据库&#xff0c;而最…

竞赛 深度学习人体跌倒检测 -yolo 机器视觉 opencv python

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习的人体跌倒检测算法研究与实现 ** 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f947;学长这里给一个题目综合评分(每项满…

flutter 使用FlutterJsonBeanFactory工具遇到的问题

如下图&#xff0c;使用FlutterJsonBeanFactory工具生成的数据类 但是其中 生成的 import package:null/&#xff0c;导致的错误&#xff1a;Target of URI doesn’t exist: ‘package:null/generated/json/asd.g.dart’ 尝试过的方法&#xff1a; 手动添加包名&#xff0c;…

面试算法39:直方图最大矩形面积

题目 直方图是由排列在同一基线上的相邻柱子组成的图形。输入一个由非负数组成的数组&#xff0c;数组中的数字是直方图中柱子的高。求直方图中最大矩形面积。假设直方图中柱子的宽都为1。例如&#xff0c;输入数组[3&#xff0c;2&#xff0c;5&#xff0c;4&#xff0c;6&am…

前后端交互系统:在Node.js中运行JavaScript

在Node.js中运行JavaScript&#xff0c;您需要编写适用于服务器端的代码&#xff0c;而不是浏览器端的代码。以下是一些示例代码&#xff0c;用于在Node.js中创建一个简单的HTTP服务器并在浏览器中访问它&#xff1a; // 引入Node.js内置的http模块 const http require(http);…

华为ERP,包含哪些内容?技术的先进性体现在哪里?

华为作为全球领先的信息和通信技术&#xff08;ICT&#xff09;解决方案提供商&#xff0c;其企业资源规划&#xff08;ERP&#xff09;系统是一个高度复杂且集成的管理软件平台&#xff0c;用于优化公司内部的业务流程和资源分配。华为ERP系统包括一系列模块和功能&#xff0c…

pytest-yaml 测试平台-2.支持上传YAML格式用例

前言 pytest-yaml 测试平台用例结构是遵循pytest-yaml-yoyo 框架用例规则。 如果你之前已经有用 pytest-yaml-yoyo 框架完成了yaml 用例的编写&#xff0c;可以直接在平台上导入yaml 用例。 yaml 用例 test_用例文件a.yml config:name: 单个用例文件test_a:name: extract提…

Linux多线程服务端编程:使用muduo C++网络库 学习笔记 第三章 多线程服务器的适用场合与常用编程模型

本文中的多线程服务器指运行在Linux上的独占式网络应用程序。硬件平台为Intel x86-64系列的多核CPU&#xff0c;单路或双路SMP&#xff08;Symmetric Multi-Processing&#xff0c;对称多处理&#xff0c;它是一种多核处理器架构&#xff0c;其中多个CPU核心共享系统的内存和其…

(三)行为模式:10、策略模式(Strategy Pattern)(C++示例)

目录 1、策略模式&#xff08;Strategy Pattern&#xff09;含义 2、策略模式的UML图学习 3、策略模式的应用场景 4、策略模式的优缺点 &#xff08;1&#xff09;优点&#xff1a; &#xff08;2&#xff09;缺点 5、C实现策略模式的实例 6、策略模式解析 1、策略模式…

解决报错:gnutls_handshake() failed: The TLS connection was non-properly terminated.

执行git clone的时候&#xff0c;出现错误&#xff1a;gnutls_handshake() failed: The TLS connection was non-properly terminated. 如图&#xff1a; 解决方式&#xff1a; 两次重置代理&#xff1a;完美解决 git config --global --unset https.https://github.com.pro…

批量编辑 Outlook 联系人

现状 Outlook 自带的联系人编辑功能无法快速、批量编辑联系人字段使用 Excel 等外部编辑器&#xff0c;可批量编辑联系人 导出联系人到文件 在【联系人】界面&#xff0c;点击【文件】在【文件】界面&#xff0c;点击【打开和导出】–>【导入/导出】在弹出的向导窗口中点…

[C国演义] 第十七章

第十七章 摆动序列最长递增子序列的个数 摆动序列 力扣链接 子序列 ⇒ dp[i]的含义: 以nums[i] 为结尾的所有子序列中的 摆动序列中的最长长度子序列 ⇒ 状态转移方程: 最后一个元素的构成 初始化: 都初始化为 1 遍历方向: 从前往后返回结果: f表 和 g表中的最大值 class …

解决Typora闪退、文件打不开等问题——Typora免费使用教程(也有免费版的)

问题描述&#xff1a; 下好Typora之后打开会闪退&#xff0c;程序运行一会之后就自己关闭了&#xff0c;显示出一片空白&#xff0c;以前写的文件也打不开。 经过一番搜索&#xff0c;发现大佬的文章&#xff0c;给出了很详细的原因分析、解决过程&#xff1b; 具体参考如下&…

【1.2】神经网络:神经元与激活函数

✅作者简介&#xff1a;大家好&#xff0c;我是 Meteors., 向往着更加简洁高效的代码写法与编程方式&#xff0c;持续分享Java技术内容。 &#x1f34e;个人主页&#xff1a;Meteors.的博客 &#x1f49e;当前专栏&#xff1a; 神经网络&#xff08;随缘更新&#xff09; ✨特色…

[数据结构]-二叉搜索树

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正。 目录 一、二叉搜…

利用Linux socat快速搭建TCP服务器

某些场合&#xff0c;需要在Linux上快速搭建一个TCP的服务器&#xff0c;接收客户端的连接&#xff0c;返回一些数据。 一般用于测试或者负载不大&#xff0c;安全性要求不高的场合&#xff0c;达到快速搭建的目的。 本文以客户端通过服务器的3334端口&#xff0c;获取服务器…

什么是残差网络结构

大家好啊&#xff0c;我是董董灿。 在我刚开始学习AI算法时&#xff0c;有一次参加一个线下的讨论&#xff0c;有个西南大学的本科生&#xff0c;在做汇报时说到了残差网络具有很好的推理效果。 那时的我还未入门&#xff0c;像是听天书&#xff0c;听了半天没搞懂说的啥意思…