【C++】矩阵转置问题详解与优化


在这里插入图片描述

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳]
本文专栏: C++

文章目录

  • 💯前言
  • 💯题目解析
  • 💯第一种实现方式:我的初始做法
    • 实现思路
    • 优缺点分析
  • 💯第二种实现方式:我的优化做法
    • 实现思路
    • 优缺点分析
  • 💯第三种实现方式:老师的做法
    • 实现思路
    • 优缺点分析
  • 💯对比与优化
    • 对比分析
    • 优化建议
  • 💯总结


在这里插入图片描述


💯前言

  • 在学习 C++ 编程中,矩阵处理是一类非常基础且重要的应用,特别是在数据处理、图像计算和科学计算等领域。矩阵转置作为最简单的矩阵变换之一,是我们需要掌握的基本技能。本次,我们通过一道矩阵转置的题目来深入解析其实现过程和优化方法,同时对比不同的实现方式,提炼出最优解法,并进行适当的知识扩展。
    以下内容包括对题目的解析、两种代码实现的详细讲解、老师的实现方案以及它们的对比分析与优化建议,最终形成一篇完整的矩阵转置解决方案与思路详解。
    C++ 参考手册
    在这里插入图片描述

💯题目解析

B2106 矩阵转置
在这里插入图片描述

题目描述
输入一个 n × m n \times m n×m 的矩阵 A A A,输出它的转置矩阵 A T A^T AT

输入格式

  1. 第一行包含两个整数 n n n m m m,表示矩阵 A A A 的行数和列数。
    • 1 ≤ n ≤ 100 1 \leq n \leq 100 1n100
    • 1 ≤ m ≤ 100 1 \leq m \leq 100 1m100
  2. 接下来 n n n 行,每行 m m m 个整数,表示矩阵 A A A 的元素。相邻两个整数之间用单个空格隔开。

输出格式
输出 m m m 行,每行 n n n 个整数,为矩阵 A A A 的转置。相邻两个整数之间用单个空格隔开。

输入输出样例

  • 输入:

    3 3
    1 2 3
    4 5 6
    7 8 9
    
  • 输出:

    1 4 7
    2 5 8
    3 6 9
    

解析

  • 输入矩阵是一个 3 × 3 3 \times 3 3×3 的矩阵。
  • 转置操作将矩阵的行变为列,列变为行。
  • 转置后的矩阵大小为 3 × 3 3 \times 3 3×3,内容如下:
    1 4 7
    2 5 8
    3 6 9
    

💯第一种实现方式:我的初始做法

#include <iostream>
using namespace std;

int arr1[105][105];
int arr2[105][105];
int main()
{
    int m, n;
    cin >> m >> n;
    for(int i = 0; i < m; i++)
    {
        for(int j = 0; j < n; j++)
        {
            cin >> arr1[i][j];
        }
    }

    for(int j = 0; j < n; j++)
    {
        for(int i = 0; i < m; i++)
        {
            arr2[j][i] = arr1[i][j];
        }
    }

    for(int j = 0; j < n; j++)
    {
        for(int i = 0; i < m; i++)
        {
            cout << arr2[j][i] << " ";
        }
        cout << endl;
    }

    return 0;    
}

在这里插入图片描述

在这里插入图片描述

实现思路

  1. 定义两个数组
    • arr1 用于存储输入矩阵;
    • arr2 用于存储转置后的矩阵。
  2. 输入矩阵
    • 通过嵌套循环将矩阵的每个元素按行存储到 arr1 中。
  3. 进行转置
    • 遍历矩阵元素,按公式 A T [ j ] [ i ] = A [ i ] [ j ] A^T[j][i] = A[i][j] AT[j][i]=A[i][j] 填充转置矩阵 arr2
  4. 输出转置矩阵
    • 遍历 arr2,逐行输出。

优缺点分析

优点:

  • 思路清晰,逻辑简单,易于理解。
  • 使用两个数组分离输入矩阵与输出矩阵的存储,代码结构清晰。

缺点:

  • 使用了两个二维数组,增加了额外的空间开销。
  • 输出逻辑未处理行末多余的空格。

💯第二种实现方式:我的优化做法

#include <iostream>
using namespace std;

int arr[105][105];
int main()
{
    int m, n;
    cin >> m >> n;
    for(int i = 0; i < m; i++)
    {
        for(int j = 0; j < n; j++)
        {
            cin >> arr[i][j];
        }
    }

    for(int j = 0; j < n; j++)
    {
        for(int i = 0; i < m; i++)
        {
            cout << arr[i][j] << " ";
        }
        cout << endl;
    }

    return 0;    
}

在这里插入图片描述

在这里插入图片描述

实现思路

  1. 省略了 arr2 数组,直接利用 arr 进行转置。
  2. 输出时按转置逻辑直接从 arr 中读取数据。
  3. 输出矩阵时直接打印转置后的值,无需额外存储。

优缺点分析

优点:

  • 相比第一种实现方式,节省了额外的数组存储空间。
  • 代码更加简洁,减少了不必要的变量定义。

缺点:

  • 同样未处理行末多余空格的问题。

💯第三种实现方式:老师的做法

#include <iostream>
using namespace std;

const int N = 110;
int arr[N][N];
int m, n;

int main()
{
    cin >> m >> n;
    for (int i = 0; i < m; i++)
    {
        for (int j = 0; j < n; j++)
        {
            cin >> arr[i][j];
        }
    }

    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            cout << arr[j][i] << " ";
        }
        cout << endl;
    }

    return 0;
}

在这里插入图片描述

在这里插入图片描述

实现思路

  1. 定义了常量 N = 110,设置矩阵的最大边界,确保足够空间存储矩阵。
  2. 使用全局变量 arr 存储矩阵,避免在函数内部重复定义。
  3. 输入矩阵后,直接利用转置逻辑输出矩阵,无需额外数组存储。

优缺点分析

优点:

  • 与第二种实现方式相似,同样节省了空间,直接利用输入数组进行转置。
  • 利用全局变量的方式,使得代码简洁易读,输入输出逻辑分明。

缺点:

  • 同样存在输出行末多余空格的问题。
  • 全局变量在复杂程序中可能引入意外的副作用。

💯对比与优化

对比分析

实现方式空间复杂度时间复杂度易读性可优化点
第一种实现 O ( n × m ) O(n \times m) O(n×m) O ( n × m ) O(n \times m) O(n×m)简单明了减少空间使用
第二种实现 O ( 1 ) O(1) O(1) O ( n × m ) O(n \times m) O(n×m)更简洁修复多余空格
第三种实现 O ( 1 ) O(1) O(1) O ( n × m ) O(n \times m) O(n×m)清晰规范避免全局变量

优化建议

  1. 去除行末多余空格:
    输出逻辑可以通过条件判断避免行末多余空格:

    for (int j = 0; j < m; j++)
    {
        cout << arr[j][i];
        if (j < m - 1) cout << " ";
    }
    
  2. 输入输出优化:
    在大数据量场景下,可以使用 scanfprintf 提高效率:

    scanf("%d %d", &m, &n);
    for (int i = 0; i < m; i++)
        for (int j = 0; j < n; j++)
            scanf("%d", &arr[i][j]);
    
  3. 避免全局变量:
    将全局变量 arr 改为局部变量,增强程序模块化能力。


💯总结

  • 在这里插入图片描述
    通过对这道矩阵转置题目的深入剖析,我们学习了三种不同的实现方法及其优缺点。随着实现方式的优化,我们逐渐减少了空间开销,使代码更高效简洁。最终,我们可以在满足题目要求的基础上,进一步提高代码的鲁棒性和扩展性。这类问题的解决,不仅让我们理解了矩阵操作的基本原理,也锻炼了对代码优化的思考能力。

在这里插入图片描述


在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

比QT更高效的一款开源嵌入式图形工具EGT-Ensemble Graphics Toolkit

文章目录 EGT-Ensemble Graphics Toolkit介绍EGT具备非常高的图形渲染效率EGT采用了非常优秀的开源2D图形处理引擎-Cairo开源2D图形处理引擎Cairo的优势Cairo 2D图像引擎的性能Cairo 2D图像引擎的实际应用案例彩蛋 - 开源EDA软件KiCAD也在使用Cairo EGT高效的秘诀还有哪些Cairo…

信息系统管理工程师教程第2版(2024年最新版)

信息系统管理工程师教程第2版 目录 第 1 章 信息化发展 第 2 章 信息技术发展 第 3 章 信息系统架构 第 4 章 信息系统治理 第 5 章 信息技术服务管理 第 6 章 软件开发过程管理 第 7 章 系统集成实施管理 第 8 章 信息系统运维管理 第 9 章 云服务及其运营…

Science Robotics让软机器人“活”得更久的3D打印!

软机器人硬件在医疗、探索无结构环境等领域有广泛应用&#xff0c;但其生命周期有限&#xff0c;导致资源浪费和可持续性差。软机器人结合软硬组件&#xff0c;复杂组装和拆卸流程使其难以维修和升级。因此&#xff0c;如何延长软机器人的生命周期并提高其可持续性成为亟待解决…

通过Dockerfile来实现项目可以指定读取不同环境的yml包

通过Dockerfile来实现项目可以指定读取不同环境的yml包 1. 挂载目录2. DockerFile3. 运行脚本deploy.sh4. 运行查看日志进入容器 5. 接口测试修改application-dev.yml 6. 优化Dockerfile7. 部分参数解释8. 优化不同环境下的日志也不同调整 Dockerfile修改部署脚本 deploy.sh重新…

AutoSar架构学习笔记

1.AUTOSAR&#xff08;Automotive Open System Architecture&#xff0c;汽车开放系统架构&#xff09;是一个针对汽车行业的软件架构标准&#xff0c;旨在提升汽车电子系统的模块化、可扩展性、可重用性和互操作性。AUTOSAR的目标是为汽车电子控制单元&#xff08;ECU&#xf…

超越YOLO11!DEIM:先进的实时DETR目标检测

DEIM: DETR with Improved Matching for Fast Convergence arXiv: https://arxiv.org/abs/2412.04234 Project webpage&#xff1a;https://www.shihuahuang.cn/DEIM/ GitHub&#xff1a;https://github.com/ShihuaHuang95/DEIM 1 背景&#xff1a;DETR目标检测框架 目标检…

深入理解 Java 接口的回调机制

前言 回调是一种非常重要的编程技术&#xff0c;它广泛应用于事件驱动的编程、异步任务和框架设计中。在 Java 中&#xff0c;回调机制通常通过 接口 来实现。本篇博客将详细解析 Java 接口的回调原理、实现方式&#xff0c;以及实际开发中的应用场景。 泪崩了&#xff0c;期末…

二、用例图

二、用例图 (一&#xff09;、用例图的基本概念 1、用例图的定义&#xff1a; 用例图是表示一个系统中用例与参与者关系之间的图。它描述了系统中相关的用户和系统对不同用户提供的功能和服务。 用例图相当于从用户的视角来描述和建模整个系统&#xff0c;分析系统的功能与…

【软考网工笔记】计算机基础理论与安全——网络安全

病毒 Melissa 宏病毒 1. 是一种快速传播的能够感染那些使用MS Word 97 和MS Office 2000 的计算机宏病毒。 2. 前面有**Macro** 表示这是宏病毒&#xff1b; 3. 宏病毒可以感染后缀为.xls的文件&#xff1b;Worm 蠕虫病毒 1. 通常是通过网络或者系统漏洞进行传播。 2. 利用信…

STM32 拓展 低功耗案例3:待机模式 (register)

需求描述 寄存器操作进入待机模式。待机模式的唤醒方式比较有限。我们这次使用WKUP引脚的上升沿唤醒。PA0就是WKUP引脚。 当然PA0仍然需要工作在下拉输入模式&#xff0c;只有这样当按键按下的时候才会有一个上升沿。 由于我们电路中PA0已经连接了LED1&#xff0c;所以要产生…

windows中硬件加速gpu计划开启cpu的使用率居高不下

1.加速gpu计划开启在任务管理器的gpu选项中看不到cuda选项&#xff0c;这给我们进行深度学习训练和推理带来很大影响。 2.开启硬件加速CPU的占用率明显增高&#xff0c;特别用GPU进行实时视频流解码时就不会分配给GPU解码&#xff0c;造成cpu占用居高不下。不利于深度学习训练…

【Go】运行自己的第一个Go程序

运行自己的第一个Go程序 一、Go语言的安装Go环境安装查看是否安装成功配置GOPROXY(代理) 二、Goland安装三、Goland破解四、新建项目 开一篇专栏记录学习Go的过程&#xff0c;一门新语言从hello world开始&#xff0c;这篇文章详细讲解Go语言环境搭建及hello world实现 一、Go语…

提升汽车金融租赁系统的效率与风险管理策略探讨

内容概要 在汽车金融租赁系统这个复杂的生态中&#xff0c;提升整体效率是每个企业都渴望达成的目标。首先&#xff0c;优化业务流程是实现高效运行的基础。通过分析目前的流程&#xff0c;找出冗余环节并进行简化&#xff0c;能够帮助企业缩短审批时间&#xff0c;提高客户满…

计算机网络 (25)IPV6

前言 IPv6&#xff0c;全称为“互联网协议第6版”&#xff08;Internet Protocol Version 6&#xff09;&#xff0c;是由互联网工程任务组&#xff08;IETF&#xff09;设计的用于替代IPv4的下一代IP协议。 一、产生背景 IPv4&#xff0c;即互联网协议第4版&#xff0c;是现行…

嵌入式系统(将软件嵌入到硬件里面)

目录 Linux起源 查看操作系统的版本 查看内核的版本&#xff1a; 内核系统架构 系统关机或重启命令 关机&#xff1a; 重启&#xff1a; linux下的软件安装 两种软件包管理机制&#xff1a; deb软件包分为两种&#xff1a; 软件包的管理工具&#xff1a;dpkg apt 1…

Conda 安装 Jupyter Notebook

文章目录 1. 安装 Conda下载与安装步骤&#xff1a; 2. 创建虚拟环境3. 安装 Jupyter Notebook4. 启动 Jupyter Notebook5. 安装扩展功能&#xff08;可选&#xff09;6. 更新与维护7. 总结 Jupyter Notebook 是一款非常流行的交互式开发工具&#xff0c;尤其适合数据科学、机器…

web实操9——session

概念 数据保存在服务器HttpSession对象里。 session也是域对象&#xff0c;有setAttribute和getAttribute方法 快速入门 代码 获取session和塞入数据&#xff1a; 获取session获取数据&#xff1a; 请求存储&#xff1a; 请求获取&#xff1a; 数据正常打印&#xff1a…

如何在电脑上使用 FaceTime

如今&#xff0c;视频通话已成为与朋友、家人和同事保持联系的重要组成部分。 FaceTime 是 Apple 推出的一款功能丰富的视频通话应用程序。它以其简单性和视频质量而闻名。但如果您想在 PC 上使用 FaceTime该怎么办&#xff1f;虽然 FaceTime 仅适用于 Apple 设备&#xff0c;但…

(框架漏洞)

1.Thinkphp 1.Thinkphp5x远程命令执⾏及getshell 搭建靶场环境 vulhub/thinkphp/5-rce docker-compose up -d #启动环境 ?sindex/think\app/invokefunction&functioncall_user_func_array&vars[0]system&vars[1][]whoami ?s/Index/\think\app/invokefunctio…

探秘Kafka源码:关键内容解析

文章目录 一、以kafka-3.0.0为例1.1安装 gradle 二、生产者源码2.1源码主流程图2.2 初始化2.3生产者sender线程初始化2.4 程序入口2.5生产者 main 线程初始化2.6 跳转到 KafkaProducer构造方法 一、以kafka-3.0.0为例 打开 IDEA&#xff0c;点击 File->Open…->源码包解…