当前位置: 首页 > news >正文

第三十四天:矩阵转置

矩阵转置

一、问题描述

  1. 输入:

    • 首先输入两个整数 nm,分别表示矩阵的行数和列数
    • 数据范围限制:1 <= n <= 1001 <= m <= 100
    • 接下来输入完整的矩阵数据:
      • n 行输入
      • 每行包含 m 个整数
      • 每个矩阵元素的取值范围是 11000
  2. 矩阵转置的定义:

    • 转置矩阵是指将原矩阵的行列互换得到的新矩阵
    • 数学表示:如果原矩阵是 A,那么转置矩阵记作 A^T
    • 元素位置关系:A^T[j][i] = A[i][j](其中 0 <= i < n0 <= j < m
    • 转置前后的矩阵维度变化:原矩阵是n×m的,转置后变为m×n的矩阵
    • 对角线元素保持不变:对于方阵(n=m),主对角线上的元素在转置前后位置不变
  3. 输出要求:

    • 输出 m 行,每行 n 个整数
    • 输出格式:同一行的相邻整数之间用单个空格隔开
    • 行末不要有多余的空格
    • 输出的转置矩阵要严格对齐,保持矩阵的整齐格式
  4. 示例说明:
    输入示例1:

    2 3
    1 2 3
    4 5 6
    

    对应的转置矩阵输出应该是:

    1 4
    2 5
    3 6
    

    输入示例2(方阵情况):

    3 3
    1 2 3
    4 5 6
    7 8 9
    

    输出:

    1 4 7
    2 5 8
    3 6 9
    

二、C++ 代码实现

#include <iostream>
using namespace std;int main() {int n, m;cin >> n >> m;int matrix[100][100];// 读取矩阵元素for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {cin >> matrix[i][j];}}// 输出转置矩阵for (int j = 0; j < m; j++) {for (int i = 0; i < n; i++) {cout << matrix[i][j];if (i < n - 1) {cout << " ";}}cout << endl;}return 0;
}

三、解析

  1. 读取矩阵元素

    • int matrix[100][100]; 创建了一个二维数组 matrix,由于题目中限定矩阵的最大行数和列数为100,所以这里定义的数组大小为 100 x 100。这个数组将用于存储输入的矩阵元素。在内存中,这个数组会按照行优先顺序连续存储,即先存储第一行的所有元素,接着是第二行,依此类推。例如,对于一个3x2的矩阵,元素在内存中的存储顺序是:matrix[0][0], matrix[0][1], matrix[1][0], matrix[1][1], matrix[2][0], matrix[2][1]。
    • 接下来的两层嵌套 for 循环是读取矩阵元素的关键部分。外层循环 for (int i = 0; i < n; i++) 控制行数,其中i从0开始到n-1结束,表示当前处理的行号。内层循环 for (int j = 0; j < m; j++) 控制列数,j从0开始到m-1结束,表示当前处理的列号。在每次循环中,cin >> matrix[i][j]; 从标准输入流中读取一个整数,并将其存储到 matrix 数组对应的 (i, j) 位置。例如,当输入矩阵为[[1,2],[3,4]]时,第一次循环(i=0,j=0)读入1,第二次循环(i=0,j=1)读入2,第三次循环(i=1,j=0)读入3,第四次循环(i=1,j=1)读入4。这样,通过循环遍历,我们就可以将整个矩阵的元素存储到 matrix 数组中。
  2. 输出转置矩阵

    • 这里同样使用了两层嵌套的 for 循环,但与读取矩阵元素时的循环顺序有所不同。外层循环 for (int j = 0; j < m; j++) 控制转置矩阵的行数(实际上是原矩阵的列数),内层循环 for (int i = 0; i < n; i++) 控制转置矩阵的列数(实际上是原矩阵的行数)。这种循环顺序的改变实现了矩阵的行列转置。例如对于一个2x3的矩阵[[1,2,3],[4,5,6]],转置后为3x2矩阵[[1,4],[2,5],[3,6]]。
    • cout << matrix[i][j]; 这行代码输出矩阵元素。因为我们要输出的是转置矩阵,所以这里的索引顺序与读取时相反,即输出的是原矩阵的(i,j)位置元素,但显示在转置矩阵的(j,i)位置,实现了行和列的互换。
    • if (i < n - 1) { cout << " "; } 这部分代码是为了满足输出格式要求。它检查当前输出的元素是否是该行的最后一个元素(即i是否小于n-1),如果不是,则在元素后面输出一个空格。例如,当n=3时,在输出第1个和第2个元素后会加空格,但输出第3个元素后不加空格,确保相邻两个整数之间用单个空格隔开。
    • 内层循环结束后,cout << endl; 输出换行符,使下一行的元素在新的一行输出。例如对于一个3x2矩阵的转置输出,每行输出2个元素后就会换行。这样,通过循环遍历,我们就可以按要求输出转置后的矩阵。同时,这种输出方式也符合题目要求的"每个元素后面没有多余的空格,每行末尾没有多余的空格"的格式规范。
http://www.dtcms.com/a/395908.html

相关文章:

  • MySQL执行计划:如何发现隐藏的性能瓶颈?
  • embedding多模态模型
  • ⚡ GitHub 热榜速报 | 2025 年 09 月 第 3 周
  • Synchronized的实现原理:深入理解Java线程同步机制
  • 初识C++、其中的引用、类(class)和结构体(struct)
  • Qt之常用控件之QWidget(四)
  • Pod生命周期
  • 【课堂笔记】复变函数-3
  • 深度学习-自然语言处理-序列模型与文本预处理
  • 【C语言】迭代与递归:两种阶乘实现方式的深度分析
  • CLIP多模态模型
  • 快手前端三面(准备一)
  • 前端-JS基础-day1
  • 【开题答辩全过程】以 J2EE在电信行业的应用研究为例,包含答辩的问题和答案
  • C++ QT Json数据的解析
  • RAG——动态护栏
  • Spring Boot 全局鉴权认证简单实现方案
  • 【靶场】webshop渗透攻击
  • 深入浅出现代GPU架构:核心类型、精度模式与选择
  • 开发避坑指南(53):git 命令行标签维护方法
  • javaEE初阶 网络编程(socket初识)
  • 基于Springboot + vue3实现的实验室研究生信息管理系统
  • TwinCat是什么
  • Linux 修炼:进程概念(下)
  • PostgreSQL 全表 count 优化实践:从 SeqScan 痛点分析到 heapam 改进与性能突破
  • 第17讲 机器学习vs神经网络
  • 1. 设计模式--工厂方法模式
  • SpringBoot常用配置
  • 【论文阅读】π0:用于通用机器人控制的视觉-语言-动作流模型
  • Spring 框架学习指南