计算矩阵相乘

第一次写文章,有问题可以直接指出,方便改正

这是作者在学离散图论通路计算时写的矩阵计算程序

代码如下:

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值