多矩阵相乘----最新版

实体层:

package com.meession.practice.day0726.entity;

/**
 * A matrix class which contains all attributes of matrix.
 * @author fzh
 *
 */
public class Matrix {
    /**
     * 矩阵的行数
     */
    private int rows;
    /**
     * 矩阵的列数
     */
    private int cols;
    /**
     * 存储矩阵的数据的二维数组
     */
    private int[][] data;
    public Matrix(){}
    public Matrix(int rows,int cols){
        this.rows = rows;
        this.cols = cols;
        this.data = new int[this.rows][this.cols];
    }
    public int getRows() {
        return rows;
    }
    public void setRows(int rows) {
        this.rows = rows;
    }
    public int getCols() {
        return cols;
    }
    public void setCols(int cols) {
        this.cols = cols;
    }
    public int[][] getData() {
        return data;
    }
    public void setData(int[][] data) {
        this.data = data;
    }
    
}

服务层:

package com.meession.practice.day0726.service;

import java.util.Random;

import com.meession.practice.day0726.entity.Matrix;

public class MatrixService{
    Random r = new Random();
    
    /**
     * 生成多个矩阵
     * @return 矩阵数组
     */
    public Matrix[] generateMatrixs(){
        /**
         * 随机生成的矩阵个数
         */
        int n = r.nextInt(4) + 3;
        Matrix[] matrixs = new Matrix[n];
        /**
         * 第一个矩阵的行数和列数随机产生
         */
        matrixs[0] = new Matrix(r.nextInt(6)+1,r.nextInt(6)+1);
        for(int i=1;i<matrixs.length;i++){
            /**
             * 第二个及以后的矩阵,行数与它前一个相等。
             */
            matrixs[i] = new Matrix(matrixs[i-1].getCols(),r.nextInt(6)+1);
        }
        return matrixs;
    }
    
    /**
     * 赋值
     * @param matrix 被赋值的矩阵
     */
    public void evaluate(Matrix matrix){
        int[][] data = new int[matrix.getRows()][matrix.getCols()];
        for(int i=0;i<matrix.getRows();i++){
            for(int j=0;j<matrix.getCols();j++){
                data[i][j] = r.nextInt(6);
            }
        }
        matrix.setData(data);
    }
    /**
     * 两个矩阵相乘
     * @param matrixA 第一个矩阵
     * @param matrixB 第二个矩阵
     * @return
     */
    public Matrix multiply(Matrix matrixA,Matrix matrixB){
        Matrix matrix = new Matrix();
        int[][] data = new int[matrixA.getRows()][matrixB.getCols()];
        for(int i=0;i<matrixA.getRows();i++){
            for(int j=0;j<matrixB.getCols();j++){
                for(int k=0;k<matrixB.getRows();k++){
                    data[i][j] += matrixA.getData()[i][k] * matrixB.getData()[k][j];
                }
            }
        }
        matrix.setData(data);
        matrix.setRows(matrixA.getRows());
        matrix.setCols(matrixB.getCols());
        return matrix;
    }
    /**
     * 输入矩阵的数据
     *  @param matrix 要被打印输出的矩阵
     */
    public void print(Matrix matrix){
        for(int i=0;i<matrix.getRows();i++){
            for(int j=0;j<matrix.getCols();j++){
                System.out.printf("%8d",matrix.getData()[i][j]);
            }
            System.out.println();
        }
    }
    
}

单元测试:

package com.meession.practice.day0726.test;

import org.junit.Test;

import com.meession.practice.day0726.entity.Matrix;
import com.meession.practice.day0726.service.MatrixService;

public class MatrixServiceTest {
    MatrixService matrixService = new MatrixService();
    
    @Test
    public void generateMatrixsTest(){
        Matrix[] matrixs = matrixService.generateMatrixs();
    }
    
    @Test
    public void evaluateTest(){
        Matrix matrix = new Matrix(5,5);
        matrixService.evaluate(matrix);
    }
    
    @Test
    public void multiplyTest(){
        Matrix matrix1 = new Matrix(5,7);
        matrixService.evaluate(matrix1);
        Matrix matrix2 = new Matrix(7,6);
        matrixService.evaluate(matrix2);
        Matrix matrix = matrixService.multiply(matrix1, matrix2);
    }
    
}

main方法测试:

package com.meession.practice.day0726.test;

import com.meession.practice.day0726.entity.Matrix;
import com.meession.practice.day0726.service.MatrixService;

public class MatrixServiceDemo {
    public static void main(String[] args) {
        MatrixServiceDemo msd = new MatrixServiceDemo();
        msd.start();
    }
    public void start(){
        MatrixService matrixService = new MatrixService();
        /**
         * 生成多个矩阵
         */
        Matrix[] matrixs = matrixService.generateMatrixs();
        /**
         * 为多个矩阵赋值
         */
        for(int i=0;i<matrixs.length;i++){
            matrixService.evaluate(matrixs[i]);
        }
        /**
         * 输入每一个矩阵的数据
         */
        for(int i=0;i<matrixs.length;i++){
            System.out.println("第"+(i+1)+"个矩阵为:");
            matrixService.print(matrixs[i]);
        }
        /**
         * 将多个矩阵依次相乘,并且输入过程中的矩阵和结果矩阵。
         */
        Matrix matrix = null;
        matrix = matrixService.multiply(matrixs[0], matrixs[1]);
        System.out.println("过程1:");
        matrixService.print(matrix);
        for(int i=2;i<matrixs.length;i++){
            matrix = matrixService.multiply(matrix, matrixs[i]);
            if(i<matrixs.length - 1){
                System.out.println("过程" + i + ":");
                matrixService.print(matrix);
            }
        }
        /**
         * 清理矩阵相称过程中产生的矩阵
         */
        System.gc();
        System.out.println("所有矩阵相乘最后的结果为:");
        matrixService.print(matrix);
    }
}

 

转载于:https://www.cnblogs.com/fuzhihong0917/p/5709077.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值