题目:矩阵的基本运算
1、矩阵创建 2、矩阵相加 3、矩阵相减 4、矩阵相乘 5、数字乘矩阵 6、矩阵上叠加 7、矩阵左右叠加 8、矩阵转置 9、矩阵旋转 10、矩阵求逆 11、矩阵输出
运用知识
1.动态内存分配是一种在程序运行时动态地分配内存空间的机制。与静态内存分配相比,动态内存分配允许在程序执行期间根据需要分配和释放内存。
在C++中,使用 new
和 delete
运算符来进行动态内存分配和释放。以下是一些关键概念和操作:
动态内存分配:使用 new
运算符来分配内存空间。例如,int* ptr = new int
; 将分配一个整数大小的内存空间,并将指针 ptr 指向该内存空间。
动态数组分配:使用 new
运算符来分配数组的内存空间。例如,int* arr = new int[5]
; 将分配一个包含 5 个整数的数组,并将指针 arr 指向该数组的首地址。
2.stoi
函数,用于将字符串转换为整数类型,将一个表示整数的字符串转换为对应的整数值,并返回该整数值。stoi
函数提供了一种方便的方法来处理字符串和整数之间的转换。
题目分析
1.创建矩阵:创建一个createMatrix
函数,接受一个二维字符串数组matrix
、行数r和列数c的参数,创建一个指定大小的二维矩阵。
在函数内部,使用一个for
循环来遍历每一行。在循环中,使用new关键字为行分配一个长度为c的字符串数组,然后将其赋值matrix[i]
,将新创建的字符串数组赋值给二维数组的当前行。
2.矩阵相加(减):创建一个addMatrix
函数,接受两个二维字符串数组matrix1
和 matrix2
,以及行数 r 和列数 c 的参数,将两个二维字符串数组中的对应元素进行相加(减),并将结果打印输出;使用了嵌套的循环来遍历每个元素,并使用 stoi
函数将字符串转换为整数进行相加。在每次循环中,将 matrix1[i][j]
和matrix2[i][j]
转换为整数类型,分别存储在 num1 和 num2 中。然后,将它们相加(减)并输出结果。
3.矩阵相乘:创建一个mulMatrix
函数,接受两个二维字符串数组matrix1
和 matrix2
,以及行数 r1 、r2和列数 c1 、c2的参数函数使用三个嵌套的循环来遍历矩阵的元素。
4.数字乘矩阵:创建一个multiplyNumber
函数,接受一个二维字符串数组matrix
、一个整数num、以及行数r和列数c作为参数,将matrix
中的每个元素转换为整数,然后与num
相乘,使用两个嵌套的for
循环来遍历matrix
中的每个元素。
5.矩阵上叠加:创建一个stackTop
函数,接受两个二维字符串数组matrix1和matrix2,以及它们各自的行数和列数作为参数。用if语句判断matrix1和matrix2的列数是否相等,如果不相等,则打印一条错误信息并返回。然后,函数两个嵌套的for循环来遍历matrix1的顶部。
6.矩阵左右叠加:创建一个stackLeft
函数,接受两个二维字符串数组matrix1和matrix2,以及它们各自的行数和列数作为参数。用if语句判断matrix1和matrix2的行数是否相等,如果不相等,则打印一条错误信息并返回。然后,使用三个嵌套的for循环数组。
7.矩阵转置:创建一个transposeMatrix
函数,它接受一个二维字符串数组matrix,和矩阵的行数r和列数c作为参数。使用两个嵌套的for循环来遍历转置后的矩阵。
8.矩阵旋转:创建一个rotateMatrix
,接受一个二维字符串数组matrix,以及矩阵的行数r和列数c作为参数。创建一个新的二维字符串数组result
,用于存储旋转后的矩阵。result的行数为原矩阵的列数,列数为原矩阵的行数。然后,使用两个嵌套的for循环来遍历原矩阵,在每次循环中,它将原矩阵中的元素按照旋转规则赋值给result数组。
9.矩阵求逆:创建一个inverseMatrix
,接受一个二维字符串数组matrix,以及矩阵的行数r和列数c作为参数。函数使用两个嵌套的for循环来遍历矩阵。
10.矩阵输出:创建一个printMatrix
函数,接受一个二维字符串数组matrix,以及矩阵的行数r和列数c作为参数。函数使用两个嵌套的for循环来遍历矩阵。外层循环控制行数,内层循环控制列数。
代码如下:
#include <iostream>
#include<string>
#include<sstream>
using namespace std;
//创建矩阵
//使用 new 运算符在堆上动态分配内存空间来创建二维数组
void creatematrix(string ** matrix, int r, int c) {
for (int i = 0; i < r; i++) {
matrix[i] = new string[c];
}
}
//矩阵相加
void addMatrix(string**matrix1, string**matrix2, int r, int c) {
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++) {
int num1 = stoi(matrix1[i][j]);
int num2 = stoi(matrix2[i][j]);
cout << num1 + num2 << " ";
}
cout << endl;
}
}
//矩阵相减
void subMatrix(string**matrix1, string**matrix2, int r, int c) {
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++) {
int num1 = stoi(matrix1[i][j]);
int num2 = stoi(matrix2[i][j]);
cout << num1 - num2 << " ";
}
cout << endl;
}
}
//矩阵相乘
void mulMatrix(string**matrix1, string**matrix2, int r1, int c1, int c2) {
for (int i = 0; i < r1; i++) {
for (int j = 0; j < c2; j++) {
int sum = 0;
for (int k = 0; k < c1; k++) {
int num1 = stoi(matrix1[i][k]);
int num2 = stoi(matrix2[k][j]);
sum += num1 * num2;
}
cout << sum << " ";
}
cout << endl;
}
}
//数字乘矩阵
void mulNumber(string**matrix, int num, int r, int c) {
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++) {
int number = stoi(matrix[i][j]);
cout << number * num << " ";
}
cout << endl;
}
}
//矩阵上下叠加
void stackTop(string**matrix1, string**matrix2, int r1, int c1, int r2, int c2) {
if (c1 != c2) {
cout << "无法叠加" << endl;
return;
}
for (int i = 0; i < r1; i++) {
for (int j = 0; j < c1; j++) {
cout << matrix1[i][j] << " ";
}
cout << endl;
}
for (int i = 0; i < r2; i++) {
for (int j = 0; j < c2; j++) {
cout << matrix2[i][j] << " ";
}
cout << endl;
}
}
void stackleft(string**matrix1, string**matrix2, int r1, int r2, int c1, int c2) {
if (r1 != r2) {
cout << "无法叠加" << endl;
return;
}
for (int i = 0; i < r1; i++) {
for (int j = 0; j < c1; j++) {
cout << matrix1[i][j] << " ";
}
for (int j = 0; j < c2; j++) {
cout << matrix2[i][j] << " ";
}
cout << endl;
}
}
//矩阵转置
void transposeMatrix(string** matrix, int r, int c) {
for (int i = 0; i < c; i++) {
for (int j = 0; j < r; j++) {
cout << matrix[j][i] << " ";
}
cout << endl;
}
}
//矩阵旋转
void rotateMatrix(string**matrix, int r, int c) {
string**result = new string*[c];
for (int i = 0; i < c; i++) {
result[i] = new string[r];
}
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++) {
result[j][r - i - 1] = matrix[i][j];
}
}
for (int i = 0; i < c; i++) {
for (int j = 0; j < r; j++) {
cout << result[i][j] << " ";
}
cout << endl;
}
for (int i = 0; i < c; i++) {
delete[]result[i];
}
delete[]result;
}
//矩阵求逆
void inverseMatrix(string**matrix, int r, int c) {
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++) {
cout << matrix[i][j] << " ";
}
cout << endl;
}
}
//矩阵输出
void printMatrix(string**matrix, int r, int c) {
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++) {
cout << matrix[i][j] << " ";
}
cout << endl;
}
}
int main() {
int r1 = 3;
int r2 = 3;
int c1 = 3;
int c2 = 3;
string**matrix1 = new string*[r1];
string**matrix2 = new string*[r2];
creatematrix(matrix1, r1, c1);
creatematrix(matrix2, r2, c2);
//初始化矩阵
for (int i = 0; i < r1; i++) {
for (int j = 0; j < c1; j++) {
matrix1[i][j] = to_string(i + j);
matrix2[i][j] = to_string(i * j);
}
}
//矩阵相加
cout << " 矩阵相加结果:" << endl;
addMatrix(matrix1, matrix2, r1, c1);
//矩阵相减
cout << "矩阵相减结果:" << endl;
subMatrix(matrix1, matrix2, r1, c1);
//矩阵相乘
cout << "矩阵相乘结果:" << endl;
mulMatrix(matrix1, matrix2, r1, c1, c2);
//数字乘矩阵
cout << "数字乘矩阵结果:" << endl;
mulNumber(matrix1,2,r1, c1);
//矩阵上叠加
cout << "矩阵上叠加:" << endl;
stackTop(matrix1, matrix2, r1, r2, c1, c2);
//矩阵左右叠加
cout << "矩阵左右叠加:" << endl;
stackTop(matrix1, matrix2, r1, r2, c1, c2);
// 矩阵转置示例
cout << "矩阵转置结果:" << endl;
transposeMatrix(matrix1, r1, c1);
// 矩阵旋转示例
cout << "矩阵旋转结果:" << endl;
rotateMatrix(matrix1, r1, c1);
// 矩阵求逆示例
cout << "矩阵求逆结果:" << endl;
inverseMatrix(matrix1, r1, c1);
// 矩阵输出示例
cout << "矩阵输出结果:" << endl;
printMatrix(matrix1, r1, c1);
// 释放动态分配的二维数组内存
for (int i = 0; i < r1; i++) {
delete[] matrix1[i];
}
delete[] matrix1;
for (int i = 0; i < r2; i++) {
delete[] matrix2[i];
}
delete[] matrix2;
return 0;
}
运行结果如下: