第一次写文章,有问题可以直接指出,方便改正
这是作者在学离散图论通路计算时写的矩阵计算程序
这是作者在学离散图论通路计算时写的矩阵计算程序
代码如下:
import java.util.Scanner;
/**
* @author liusilei
* @date 2021/11/5
* @apiNote
* 计算矩阵相乘
* 输入1添加x矩阵,输入2添加y矩阵,输入3将矩阵1自乘,输入4矩阵相乘,输入5查看矩阵,输入6清空原始数据,输入其他字符结束程序
* 首先输入两个矩阵行列大小
* 一次输入一行,中间用空格隔开
* 可以对单个矩阵多次相乘(while结构,控制结束)
*/
public class Matrix_Multiply {
static int[][] x;
static int[][] y;
static int[][] result;
//初始行与列
static int Xrow = 0;
static int Xcol = 0;
static int Yrow = 0;
static int Ycol = 0;
static Scanner sc = new Scanner(System.in);
public static void main(String[] args) {
while (true) {
System.out.println("输入1添加x矩阵,输入2添加y矩阵,输入3将x矩阵自乘,输入4将x,y矩阵相乘,输入5查看矩阵,输入6清空原始数据,输入其他字符结束程序");
//选择模式
int style = sc.nextInt();
switch (style) {
case 1:
addX();
break;
case 2:
addY();
break;
case 3:
multiplySelf();
break;
case 4:
multipy();
break;
case 5:
display();
break;
case 6:
x = null;
y = null;
result = null;
System.out.println("初始化完成");
break;
default:
}
}
}
private static void addX() {
System.out.println("输入矩阵行数");
Xrow = sc.nextInt();
System.out.println("输入矩阵列数");
Xcol = sc.nextInt();
x = new int[Xrow][Xcol];
System.out.println("接下来每一行输入"+ Xcol +"个数,作为矩阵的数字");
for (int i = 0; i < Xrow; i++) {
sc = new Scanner(System.in);
//每次读取一行,逐行输入
String str = sc.nextLine();
String[] cols = str.split(" ");
for (int j = 0; j < Xcol; j++) {
x[i][j] = Integer.parseInt(cols[j]);
}
}
System.out.println("x矩阵添加完成");
}
private static void addY() {
System.out.println("输入矩阵行数");
Yrow = sc.nextInt();
System.out.println("输入矩阵列数");
Ycol = sc.nextInt();
if (Yrow!=Xcol||Ycol!=Xrow) {
System.out.println("矩阵格式输入错误,");
System.out.println("y矩阵行数应与x矩阵列数相同");
System.out.println("y矩阵列数应与x矩阵行数相同");
return;
}
y = new int[Yrow][Ycol];
System.out.println("接下来每一行输入"+ Ycol +"个数,作为矩阵的数字");
for (int i = 0; i < Yrow; i++) {
sc = new Scanner(System.in);
//每次读取一行,逐行输入
String str = sc.nextLine();
String[] cols = str.split(" ");
for (int j = 0; j < Ycol; j++) {
y[i][j] = Integer.parseInt(cols[j]);
}
}
System.out.println("y矩阵添加完成");
}
private static void multipy() {
if (y==null) {
y = x;
}
result = new int[Xcol][Xrow];
int tmp = 0;
//这里是矩阵相乘的核心内容,原理等同于线性代数矩阵相乘概念
//X矩阵的一行逐个乘以y矩阵的每一列,结果相加为结果矩阵的一个元素
//i表示x矩阵的行判断,j表示y矩阵列的变化,k表示y矩阵每一列上不同行的变化
for (int i = 0; i < Xrow; i++) {
for (int j = 0; j < Xrow; j++) {
for (int k = 0; k < Xcol; k++) {
tmp += x[i][k] * y[k][j];
}
result[i][j] = tmp;
tmp = 0;
}
}
System.out.println("矩阵相乘完成");
}
private static void multiplySelf() {
if (result!=null) {
y = result;
} else {
y = x;
}
Yrow = Xrow;
Ycol = Xcol;
//直接调用上面的方法
multipy();
System.out.println("矩阵自乘完成");
}
private static void display() {
if (x!=null) {
System.out.println("X矩阵数据为:");
for (int i = 0; i < Xrow; i++) {
for (int j = 0; j < Xcol; j++) {
System.out.print(x[i][j] + " ");
}
System.out.println();
}
}
if (y!=null) {
System.out.println("Y矩阵数据为:");
for (int i = 0; i < Yrow; i++) {
for (int j = 0; j < Ycol; j++) {
System.out.print(y[i][j] + " ");
}
System.out.println();
}
}
if (result!=null) {
System.out.println("result矩阵数据为:");
for (int i = 0; i < Xrow; i++) {
for (int j = 0; j < Xcol; j++) {
System.out.print(result[i][j] + " ");
}
System.out.println();
}
}
System.out.println("矩阵展示完成");
}
}
如果发现问题可以跟作者联系
---------------------------------------------------------
发现了一些问题,行列不同的矩阵自乘会报错,(行列不同好像本来就不能自乘) https://download.csdn.net/download/qq_53104231/85584389