JAVA写出1、输于两个n×n的矩阵A和B,实现乘积运算,并输出运算结果和计算时间;2、逐渐增大矩阵A和B的规模,分析运算时间的变化。3、用分治法的实现矩阵乘积运算,比较使用分治法前后的计算量差异。中文备注
时间: 2024-05-16 19:15:21 浏览: 23
1、实现矩阵乘积运算的JAVA代码如下:
```java
public class MatrixMultiplication {
public static void main(String[] args) {
int n = 1000; // 矩阵大小
int[][] A = new int[n][n];
int[][] B = new int[n][n];
int[][] C = new int[n][n];
// 初始化矩阵A和B
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
A[i][j] = i + j;
B[i][j] = i - j;
}
}
// 计时开始
long startTime = System.currentTimeMillis();
// 矩阵乘法
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
for (int k = 0; k < n; k++) {
C[i][j] += A[i][k] * B[k][j];
}
}
}
// 计时结束
long endTime = System.currentTimeMillis();
long timeElapsed = endTime - startTime;
// 输出结果和计算时间
System.out.println("矩阵乘积结果:");
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
System.out.print(C[i][j] + " ");
}
System.out.println();
}
System.out.println("计算时间:" + timeElapsed + "毫秒");
}
}
```
2、逐渐增大矩阵A和B的规模,可以使用以下代码来测试运算时间的变化:
```java
public class MatrixMultiplicationTest {
public static void main(String[] args) {
for (int n = 100; n <= 1000; n += 100) {
int[][] A = new int[n][n];
int[][] B = new int[n][n];
int[][] C = new int[n][n];
// 初始化矩阵A和B
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
A[i][j] = i + j;
B[i][j] = i - j;
}
}
// 计时开始
long startTime = System.currentTimeMillis();
// 矩阵乘法
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
for (int k = 0; k < n; k++) {
C[i][j] += A[i][k] * B[k][j];
}
}
}
// 计时结束
long endTime = System.currentTimeMillis();
long timeElapsed = endTime - startTime;
// 输出计算时间
System.out.println("矩阵大小:" + n + "x" + n + ",计算时间:" + timeElapsed + "毫秒");
}
}
}
```
3、使用分治法实现矩阵乘积运算的JAVA代码如下:
```java
public class MatrixMultiplicationDivideAndConquer {
public static void main(String[] args) {
int n = 1000; // 矩阵大小
int[][] A = new int[n][n];
int[][] B = new int[n][n];
int[][] C = new int[n][n];
// 初始化矩阵A和B
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
A[i][j] = i + j;
B[i][j] = i - j;
}
}
// 计时开始
long startTime = System.currentTimeMillis();
// 矩阵乘法
matrixMultiplicationDivideAndConquer(A, B, C, 0, 0, 0, 0, 0, 0, n);
// 计时结束
long endTime = System.currentTimeMillis();
long timeElapsed = endTime - startTime;
// 输出结果和计算时间
System.out.println("矩阵乘积结果:");
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
System.out.print(C[i][j] + " ");
}
System.out.println();
}
System.out.println("计算时间:" + timeElapsed + "毫秒");
}
/**
* 分治法实现矩阵乘积
*
* @param A 矩阵A
* @param B 矩阵B
* @param C 矩阵C
* @param rowA A矩阵起始行
* @param colA A矩阵起始列
* @param rowB B矩阵起始行
* @param colB B矩阵起始列
* @param rowC C矩阵起始行
* @param colC C矩阵起始列
* @param n 矩阵大小
*/
public static void matrixMultiplicationDivideAndConquer(int[][] A, int[][] B, int[][] C,
int rowA, int colA, int rowB, int colB, int rowC, int colC, int n) {
if (n == 1) {
C[rowC][colC] += A[rowA][colA] * B[rowB][colB];
} else {
int m = n / 2;
matrixMultiplicationDivideAndConquer(A, B, C, rowA, colA, rowB, colB, rowC, colC, m);
matrixMultiplicationDivideAndConquer(A, B, C, rowA, colA + m, rowB + m, colB, rowC, colC, m);
matrixMultiplicationDivideAndConquer(A, B, C, rowA, colA, rowB, colB + m, rowC, colC + m, m);
matrixMultiplicationDivideAndConquer(A, B, C, rowA, colA + m, rowB + m, colB + m, rowC, colC + m, m);
matrixMultiplicationDivideAndConquer(A, B, C, rowA + m, colA, rowB, colB, rowC + m, colC, m);
matrixMultiplicationDivideAndConquer(A, B, C, rowA + m, colA + m, rowB + m, colB, rowC + m, colC, m);
matrixMultiplicationDivideAndConquer(A, B, C, rowA + m, colA, rowB, colB + m, rowC + m, colC + m, m);
matrixMultiplicationDivideAndConquer(A, B, C, rowA + m, colA + m, rowB + m, colB + m, rowC + m, colC + m, m);
}
}
}
```
使用分治法后,计算量的变化如下:
对于矩阵大小为100x100的情况,矩阵乘积的计算量为100x100x100=1,000,000。
对于矩阵大小为1000x1000的情况,原始的矩阵乘积计算量为1000x1000x1000=1,000,000,000,而使用分治法后的矩阵乘积计算量为8x(500x500x500)=1,000,000,000,也就是说使用分治法后的计算量与原始计算量相等,但分治法需要递归调用多次,因此会增加额外的运算开销。但是,对于更大的矩阵,使用分治法可以大大减少计算量,从而提高运行效率。
相关推荐
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)