【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 改为局部变量,增强程序模块化能力。


💯总结

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

在这里插入图片描述


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

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

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

相关文章

在线二维码生成器-GO在线工具-文本工具

一款高效、便捷的在线二维码生成工具&#xff0c;支持生成文本、链接、名片等多种类型的二维码。无需安装软件&#xff0c;快速在线生成高清二维码&#xff0c;适用于个人使用和商业推广。免费使用&#xff0c;让二维码生成变得更简单。 gotool

【微服务】2、网关

Spring Cloud微服务网关技术介绍 单体项目拆分微服务后的问题 服务地址问题&#xff1a;单体项目端口固定&#xff08;如黑马商城为8080&#xff09;&#xff0c;拆分微服务后端口各异&#xff08;如购物车808、商品8081、支付8086等&#xff09;且可能变化&#xff0c;前端难…

SpringBoot3-深入理解自动配置类的原理(尚硅谷SpringBoot3-雷神)

文章目录 目录了解自动配置 一、导入对应场景的Mean依赖&#xff1a;1、引入依赖**找到自动配置类的所有配置都存放在哪里** 二、编写主程序&#xff1a;SpringBootApplication观察源码时所需要知道的几个核心注解&#xff1a;1、观察SpringBootApplication源码都做了什么 三、…

图像分割基础:使用Python和scikit-image库

大家好&#xff0c;今天我们将一起探讨图像分割的基础知识&#xff0c;并使用Python编程语言以及scikit-image库来实现一个简单的图像分割示例。图像分割是图像处理中的一项重要技术&#xff0c;它允许我们将图像划分为多个部分或对象&#xff0c;这对于图像分析和计算机视觉任…

SpringBoot中实现拦截器和过滤器

【SpringBoot中实现过滤器和拦截器】 1.过滤器和拦截器简述 过滤器Filter和拦截器Interceptor&#xff0c;在功能方面很类似&#xff0c;但在具体实现方面差距还是比较大的。 2.过滤器的配置 2.1 自定义过滤器&#xff0c;实现Filter接口(SpringBoot 3.0 开始&#xff0c;jak…

基于LightGBM的集成学习算法

目录 一、LightGBM基本原理1.1 基于直方图的决策树算法1.1.1 连续变量分箱 1.2 互斥特征捆绑1.2.1 互斥特征捆绑计算流程1.2.2 互斥特征捆绑算法基本原理1.2.2.1 冲突比例&#xff08;conflict_rate&#xff09;1.2.2.2 图着色1.2.2.3 特征捆绑 1.3 基于梯度的单边采样&#xf…

trendFinder - 利用 AI 掌握社交媒体上的热门话题

1600 Stars 177 Forks 7 Issues 2 贡献者 MIT License Javascript 语言 代码: https://github.com/ericciarla/trendFinder 更多AI开源软件&#xff1a;AI开源 - 小众AI Trend Finder 收集并分析来自关键影响者的帖子&#xff0c;然后在检测到新趋势或产品发布时发送 Slack 通知…

Level DB --- BloomFilterPolicy

BloomFilterPolicy是Level DB中重要的数据过滤模块&#xff0c;它主要用来先过滤在Block中不存在的key&#xff0c;减少Block的搜索计算量。 Bloom Filter 从原理上来讲Bloom FIlter相对来说原理还是比较简单的&#xff0c;将一个key经过一次&#xff08;组合&#xff09;ha…

ELK 使用教程采集系统日志 Elasticsearch、Logstash、Kibana

前言 你知道对于一个系统的上线考察&#xff0c;必备的几样东西是什么吗&#xff1f;其实这也是面试中考察求职者&#xff0c;是否真的做过系统开发和上线的必备问题。包括&#xff1a;服务治理(熔断/限流) (opens new window)、监控 (opens new window)和日志&#xff0c;如果…

【MySQL】九、表的内外连接

文章目录 前言Ⅰ. 内连接案例&#xff1a;显示SMITH的名字和部门名称 Ⅱ. 外连接1、左外连接案例&#xff1a;查询所有学生的成绩&#xff0c;如果这个学生没有成绩&#xff0c;也要将学生的个人信息显示出来 2、右外连接案例&#xff1a;对stu表和exam表联合查询&#xff0c;把…

机器学习周报-ModernTCN文献阅读

文章目录 摘要Abstract 0 提升有效感受野&#xff08;ERF&#xff09;1 相关知识1.1 标准卷积1.2 深度分离卷积&#xff08;Depthwise Convolution&#xff0c;DWConv&#xff09;1.3 逐点卷积&#xff08;Pointwise Convolution&#xff0c;PWConv&#xff09;1.4 组卷积(Grou…

计算机的错误计算(二百零二)

摘要 利用三个大模型化简计算 前面分式的分子为零&#xff0c;因此正确值是后面的数值300.09...321 . 让三个大模型计算&#xff0c;它们均没有看出分式的分子中被减数与减数是相等的。因此&#xff0c;均得出了错误结果。 例1. 化简计算摘要中算式的值。 下面是一个大模型的…

2025-01-04 Unity插件 YodaSheet1 —— 插件介绍

文章目录 1 介绍2 工作原理2.1 ScriptableObject -> YadeSheetData2.2 YadeDatabase 存储多个 YadeSheetData 3 用途4 缺点5 推荐 1 介绍 ​ Yade 提供类似于 Excel 或者 Google Sheets 的表格编辑器&#xff0c;可以轻松地在 Unity 编辑器中 编辑&#xff0c;搜索&#xf…

connect to host github.com port 22: Connection timed out 的解决方法

原因是 Github 被 GFW 屏蔽了。 Windows 系统&#xff0c;打开 C:\Windows\System32\drivers\etc&#xff0c;复制其中的 hosts 文件至桌面&#xff0c;用文本编辑器或者其他工具打开。 复制以下内容进去&#xff1a; 140.82.114.4 github.com 151.101.1.6 github.global.ss…

memcached的基本使用

memcached是一种基于键值对的内存数据库&#xff0c;一般应用于缓存数据&#xff0c;提高数据访问速度&#xff0c;减轻后端数据库压力。 安装 这里以Ubuntu为例&#xff0c;其他系统安装方法请看官方文档。 sudo apt-get update sudo apt-get install memcached启动 memca…

【操作系统不挂科】操作系统期末考试题库<2>(单选题&简答题&计算与分析题&程序分析题&应用题)

前言 大家好吖&#xff0c;欢迎来到 YY 滴 操作系统不挂科 系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 目录 一、单项选择题&#xff08;每空2分&#xff0c;共40分&#xff09;1&#xff0e;以下选项中&#xff0c;&#xff08; &#xff09;不是操…

ip属地的信息准确吗?ip归属地不准确怎么办

在数字化时代&#xff0c;IP属地信息成为了我们日常生活中不可或缺的一部分。在各大社交媒体平台上&#xff0c;IP属地信息都扮演着重要的角色。然而&#xff0c;随着技术的不断进步和网络的复杂性增加&#xff0c;IP属地信息的准确性问题也日益凸显。那么&#xff0c;IP属地信…

【GUI-pyqt5】QWidget类

1. 描述 所有可视空间的基类是一个最简单的空白控件控件是用户界面的最小元素 接收各种事件&#xff08;鼠标、键盘&#xff09;绘制在桌面上&#xff0c;显示给用户看 每个控件都是矩形的&#xff0c;它们按z轴顺序排序控件由其父控件和前面的控件剪切没有父控件的控件&#…

Linux(Centos 7.6)命令详解:ls

1.命令作用 列出目录内容(list directory contents) 2.命令语法 Usage: ls [OPTION]... [FILE]... 3.参数详解 OPTION: -l&#xff0c;long list 使用长列表格式-a&#xff0c;all 不忽略.开头的条目&#xff08;打印所有条目&#xff0c;包括.开头的隐藏条目&#xff09…

unity学习6:unity的3D项目的基本界面和菜单

目录 1 unity界面的基本认识 1.1 file 文件 1.2 edit 编辑/操作 1.3 Assets 1.4 gameobject 游戏对象 1.5 组件 1.6 windows 2 这些部分之间的关系 2.1 关联1&#xff1a; Assets & Project 2.2 关联2&#xff1a;gameobject & component 2.3 关联3&#xf…