【C++】B2106 矩阵转置


在这里插入图片描述

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳]
本文专栏: 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/948920.html

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

相关文章

五月天TV 1.1.0 | 频道丰富的娱乐向电视直播应用

五月天IPTV是一款提供多种频道的电视直播应用&#xff0c;包括体育、动漫、音乐等。虽然频道种类繁多&#xff0c;但正经频道较少&#xff0c;更适合追求娱乐和轻松内容的用户群体。软件在测试中发现存在一些小问题&#xff0c;频道质量参差不齐。 大小&#xff1a;15M 下载地…

高等数学 8.2 数量积 向量积 *混合积

文章目录 一、数量积二、向量积三、*混合积 一、数量积 对两个向量做运算 a \boldsymbol{a} a 和 b \boldsymbol{b} b &#xff0c;运算结果是一个数&#xff0c;它等于 ∣ a ∣ |\boldsymbol{a}| ∣a∣ &#xff0c; ∣ b ∣ |\boldsymbol{b}| ∣b∣ 及它们的夹角 θ \th…

Crosslink-NX应用连载(12):如何复用特殊功能管脚

作者&#xff1a;Hello,Panda 大家早上好。 昨天有朋友私信我&#xff0c;如何复用Crosslink-NX的特殊功能引脚如PROGRAMN、DONE、INITN诸如这些。熊猫君在这里简单介绍下&#xff1a; 以LIFCL-33U-8CTG104C为例&#xff0c;我们建立一个简单的指示灯LED周期闪烁的工程&…

Spring MVC和servlet

1.Spring MVC是Spring框架的一个扩展 2.Spring MVC工作流程 1、用户发送请求至前端控制器DispatcherServlet。 2、DispatcherServlet收到请求调用HandlerMapping处理器映射器。 3、处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找)&#xff0c;生成处理器对象及…

TI毫米波雷达原始数据解析之Lane数据交换

TI毫米波雷达原始数据解析之Lane数据交换 背景Lane 定义Lane 确认确认LVDS Lane 数量的Matlab 代码数据格式参考 背景 解析使用mmWave Studio 抓取的ADC Data Lane 定义 芯片与DCA100之间的数据使用LVDS接口传输&#xff0c;使用mmWave Studio 配置过程中有一个选项是LVDS L…

VisionPro软件Image Stitch拼接算法

2D图像拼接的3种情景 1.一只相机取像位置固定&#xff0c;或者多只相机固定位置拍图&#xff0c;硬拷贝拼图&#xff0c;采用CopyRegion工具实现 2.一只或多只相机在多个位置拍照&#xff0c;相机视野互相重叠&#xff0c;基于Patmax特征定位后&#xff0c;无缝 拼图&#xff…

const修饰指针总结

作者简介&#xff1a; 一个平凡而乐于分享的小比特&#xff0c;中南民族大学通信工程专业研究生在读&#xff0c;研究方向无线联邦学习 擅长领域&#xff1a;驱动开发&#xff0c;嵌入式软件开发&#xff0c;BSP开发 作者主页&#xff1a;一个平凡而乐于分享的小比特的个人主页…

回归预测 | MATLAB实ELM-Adaboost多输入单输出回归预测

回归预测 | MATLAB实ELM-Adaboost多输入单输出回归预测 目录 回归预测 | MATLAB实ELM-Adaboost多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 一、极限学习机&#xff08;ELM&#xff09; 极限学习机是一种单层前馈神经网络&#xff0c;具有训练速…

centos,789使用mamba快速安装R及语言包devtools

如何进入R语言运行环境请参考&#xff1a;Centos7_miniconda_devtools安装_R语言入门之R包的安装_r语言devtools包怎么安装-CSDN博客 在R里面使用安装devtools经常遇到依赖问题&#xff0c;排除过程过于费时&#xff0c;使用conda安装包等待时间长等。下面演示centos,789都是一…

Pytest钩子函数,测试框架动态切换测试环境

在软件测试中&#xff0c;测试环境的切换是个令人头疼的问题。不同环境的配置不同&#xff0c;如何高效切换测试环境成为许多测试开发人员关注的重点。你是否希望在运行测试用例时&#xff0c;能够动态选择测试环境&#xff0c;而不是繁琐地手动修改配置&#xff1f; Pytest 测…

node.js内置模块之---stream 模块

stream 模块的作用 在 Node.js 中&#xff0c;stream 模块是一个用于处理流&#xff08;stream&#xff09;的核心模块。流是一种处理数据的抽象方式&#xff0c;允许程序处理大量数据时不会一次性将所有数据加载到内存中&#xff0c;从而提高性能和内存效率。通过流&#xff0…

深入理解 PHP 构造函数和析构函数:附示例代码

在深入学习 PHP 面向对象编程 (OOP) 的过程中&#xff0c;构造函数和析构函数是两个需要掌握的基础概念。这些特殊方法能够有效地初始化和清理对象&#xff0c;使代码更加简洁有序。 本文将深入探讨 PHP 中构造函数和析构函数的工作机制&#xff0c;详细解析它们的语法&#x…

(二)当人工智能是一个函数,函数形式怎么选择?ChatGPT的函数又是什么?

在上一篇文章中&#xff0c;我们通过二次函数的例子&#xff0c;讲解了如何训练人工智能。今天&#xff0c;让我们进一步探讨&#xff1a;面对不同的实际问题&#xff0c;应该如何选择合适的函数形式&#xff1f; 一、广告推荐系统中的函数选择 1. 业务目标 想象一下&#x…

“知识图谱AI教学辅助系统:点亮智慧学习的新灯塔

嘿&#xff0c;各位教育界的小伙伴们&#xff01;今天咱们来聊聊一个超级有料的话题——知识图谱AI教学辅助系统。想象一下&#xff0c;如果有一个智能导师能根据你的需求定制专属的学习路径&#xff0c;还能像百科全书一样随时解答疑问&#xff0c;是不是感觉学习变得更高效、…

Linux C编程——文件IO基础

文件IO基础 一、简单的文件 IO 示例二、文件描述符三、open 打开文件1. 函数原型2. 文件权限3. 宏定义文件权限4. 函数使用实例 四、write 写文件五、read 读文件六、close 关闭文件七、Iseek 绍 Linux 应用编程中最基础的知识&#xff0c;即文件 I/O&#xff08;Input、Outout…

Flink源码解析之:Flink on k8s 客户端提交任务源码分析

Flink on k8s 客户端提交任务源码分析 当我们需要在代码中提交Flink job到kubernetes上时&#xff0c;需要如何做呢&#xff1f;要引入什么第三方依赖&#xff1f;需要提供什么内容&#xff1f;flink是如何将job提交到k8s上的&#xff1f;经过了什么样的流程&#xff0c;内部有…

kubernetes学习-Service

kubernetes学习-Service 1. Service说明2. 功能3.Service类型3.1 NodePort3.1.1 创建web-service.yaml3.1.2 创建web-pod.yaml3.1.3 部署3.1.4 验证 3.2 ClusterIP3.2.1 创建web-clusterIp-service.yaml3.2.2 创建web-clusterIp-pod.yaml3.2.3 部署3.2.4 验证 3.3 LoadBalancer…

使用WebSocket 获取实时数据

回车发送数据&#xff0c;模拟服务器发送数据 效果图&#xff1a; 源码&#xff1a; <template><div><h1>WebSocket 实时数据</h1><input type"text" v-model"ipt" keyup.enter"sendMessage(ipt)"><div v-if…

NeurIPS 2024 | SHMT:通过潜在扩散模型进行自监督分层化妆转移(阿里,武汉理工)

当前的妆容转移技术面临两个主要挑战&#xff1a; 缺乏成对数据&#xff0c;导致模型训练依赖于低质量的伪配对数据&#xff0c;从而影响妆容的真实感&#xff1b; 不同妆容风格对面部的影响各异&#xff0c;现有方法难以有效处理这种多样性。 今天给大家介绍的方法是由阿里联…

Mongo高可用架构解决方案

Mongo主从复制哪些事(仅适用特定场景) 对数据强一致性要求不高的场景,一般微服务架构中不推荐 master节点可读可写操作,当数据有修改时,会将Oplog(操作日志)同步到所有的slave节点上。那么对于从节点来说仅只读,所有slave节点从master节点同步数据,然而从节点之间互相…