提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
题目
编写函数、完成n*n矩阵的转置操作,矩阵各元素随机生成。
一、思想
首先需要对nn矩阵实现初始化,使用动态数组,并随即进行数
组元素生成。动态二维数组的每一元素包含的是动态一维数组。使用数组指针,
分配一个指针数组、int**arr=new int[n],再为每一元素循环分配数组,
使用arr[i]=new int[n]。此时二维数组的声明结束,元素的初始化可以使
用rand()%100来产生0-99赋值给动态二维数组。对于矩阵的转置,因为
题目要求是方阵,因此只需要通过对上下三角内元素进行交换即可实现。遍历矩
阵的上三角或下三角,将arr[i][j]元素与arr[j][i]进行交换即可。
二、代码实操
代码如下(示例):
#include<stdio.h>
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
const int N = 3; // 定义矩阵的大小为3*3,可以根据需要修改
int main()
{
int a[N][N], b[N][N]; // 定义原矩阵a和转置后的矩阵b
srand(time(NULL)); // 设置随机数种子
// 随机生成矩阵a的元素
cout << "矩阵a为:" << endl;
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
a[i][j] = rand() % 100;
cout << a[i][j] << " ";
}
cout << endl;
}
// 进行矩阵转置
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
b[j][i] = a[i][j]; // 将原矩阵中的行和列对调
}
}
// 输出转置后的矩阵b
cout << "矩阵b为:" << endl;
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
cout << b[i][j] << " ";
}
cout << endl;
}
return 0;
}
代码分析
代码分析:
- 首先定义了一个常量N表示矩阵的大小,这里设为3。
- 定义了两个二维数组a和b,分别表示原矩阵和转置后的矩阵。
- 通过srand和time函数设置随机数种子,以便生成随机数。
- 随机生成矩阵a的元素,并输出到屏幕上。
- 进行矩阵转置,即将原矩阵中的行和列对调,得到转置后的矩阵b。
- 输出转置后的矩阵b到屏幕上。
值得注意的是,这里采用了“行优先”的存储方式,即在二维数组中,第一维是行数,第二维是列数。在进行矩阵转置时,需要将原矩阵中的行和列对调,因此循环中第一个循环变量i用于遍历行,第二个循环变量j用于遍历列,而在对二维数组进行访问时,第一个下标表示行,第二个下标表示列。因此,在将原矩阵中的a[i][j]转置到b[j][i]时,需要将第一个下标j放在前面,第二个下标i放在后面。这样就可以得到转置后的矩阵b了。