矩阵的基本运算

题目:矩阵的基本运算

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;
}

运行结果如下:

posted @ 2023-07-31 13:55  无边界  阅读(387)  评论(0)    收藏  举报