简体   繁体   中英

Adding Matrices

In this program I am attempting to create a new method that can add two of the matrices that are created. In order to do this I need to check to see if the matrices have the same dimensions and then print out the added matrices. The matrices are filled with random numbers that are set in the code. Can someone help create a method that will allow me to add two of them together?

public class Matrix {
    private int [][] grid;  
    
    /**
     * default constructor: creates 3x3 matrix with random values
     * in the range 0..9
     */
    public Matrix() {
        grid = new int[3][3];
        for(int x=0; x<3; x++)
            for(int y=0; y<3; y++)
                grid[x][y] = (int)(Math.random()*10);
    }
    
    /**
     * Creates matrix of specified size with random values 0..9
     * @param size positive integer that represents the number of rows
     * and columns in the matrix
     */
    public Matrix(int size) {
        grid = new int[size][size];
        for(int x=0; x<size; x++)
            for(int y=0; y<size; y++)
                grid[x][y] = (int)(Math.random()*10);
    }
    
    /** 
     * Creates a matrix of specified size with random values 0..9
     * @param rows number of rows in matrix
     * @param columns number of columns int matrix
     */
    public Matrix(int rows, int columns) {
        grid = new int[rows][columns];
        for(int x=0; x<rows; x++)
            for(int y=0; y<columns; y++)
                grid[x][y] = (int)(Math.random()*10);
    }
    
    /**
     * @return String formatted as an m x n matrix of m rows and 
     * n columns
     */
    public String toString() {
        int rows = grid.length;
        int columns = grid[0].length;
        String table = new String("");
        for(int x=0; x<rows; x++) {
            table = table + '|' + '\t';
            for(int y=0; y<columns; y++)
                table = table + grid[x][y] + '\t';
            table = table + '|' + '\n';
        }
        return table;
    }
    
    /**
     * @return true if number of rows equals number of columns
     */
    public boolean isSquare() {
        return grid.length == grid[0].length;
    }
    
    /**
     * @param other another matrix to compare to this one
     * @return true if this matrix and the other have the same
     * number of rows and columns
     */
    public boolean sameSize(Matrix other) {
        return grid.length == other.grid.length && 
                grid[0].length == other.grid[0].length;
    }
    // main method: for testing
    public static void main(String[] args) {
        
        Matrix m = new Matrix();
        Matrix n = new Matrix((int)(Math.random()*5)+2);
        Matrix o = new Matrix(((int)(Math.random()*5)+2),
                            ((int)(Math.random()*5)+2));
        System.out.println ("First matrix:");
        System.out.print(m);
        System.out.println ("Second matrix:");
        System.out.println(n);
        System.out.println ("Third matrix:");
        System.out.println(o);
        if(m.sameSize(n))
            System.out.println("First two are the same size");
        else
            System.out.println("First two are not the same size");
        if(o.isSquare())
            System.out.println("All three are square matrices");
        else
            System.out.println("Only first two are square matrices");      
    }
}

You first check that matrices are of the same size and then you sum up each value in both matrices one by one like

public Matrix sum(Matrix other) {
    if (this.sameSize(other)) {
        Matrix result = new Matrix(this.grid.length, this.grid[0].length);
        for (int i=0; i<this.grid.length; i++) {
            for (int j=0; j<this.grid.length; j++) {
                result.grid[i][j] = this.grid[i][j] + other.grid[i][j];
            }
        }
        return result;
    } else {
        return null; // Can't sum those matrices
    }
}

Add this to the Matrix class:

/**
 * Creates a new Matrix with the values of 
 * both Matrix(s) added together.
 * @param otherMatrix The Matrix to be added.
 * @return The new Matrix.
 */
public Matrix add(Matrix otherMatrix) {
    if (sameSize(otherMatrix)) {
        Matrix newMatrix = new Matrix(grid.length, grid[0].length);
        for (int x = 0; x < grid.length; x++) {
            for (int y = 0; y < grid[0].length; y++) {
                newMatrix.grid[x][y] = grid[x][y] + otherMatrix.grid[x][y];
            }
        }
        return newMatrix;
    } else {
        throw new Error("The Matrix(s) aren't the same size.");
    }
}

Then call it with:

Matrix addedMatrix = matrix.add(otherMatrix);
public class Matrix {

    private final int[][] grid;
    private final int width;
    private final int height;

    public Matrix() {
        this(3);
    }

    public Matrix(int size) {
        this(size, size);
    }

    public Matrix(int rows, int cols) {
        grid = createGrid(rows, cols);
        width = cols;
        height = rows;
    }

    @Override
    public String toString() {
        StringBuilder buf = new StringBuilder();
        buf.append('[');

        for (int row = 0; row < grid.length; row++) {
            if (buf.length() > 1)
                buf.append(',');

            buf.append('[');

            for (int col = 0; col < grid[row].length; col++) {
                if (col > 0)
                    buf.append(',');
                buf.append(grid[row][col]);
            }

            buf.append(']');
        }

        return buf.append(']').toString();
    }

    public boolean isSquare() {
        return width == height;
    }

    public boolean isSameSize(Matrix m) {
        return m != null && width == m.width && height == m.height;
    }

    public void add(Matrix m) {
        if (!isSameSize(m))
            return;

        for (int row = 0; row < grid.length; row++)
            for (int col = 0; col < grid[row].length; col++)
                grid[row][col] += m.grid[row][col];
    }

    private static int[][] createGrid(int rows, int cols) {
        Random random = new Random();
        int[][] grid = new int[rows][cols];

        for (int row = 0; row < grid.length; row++)
            for (int col = 0; col < grid[row].length; col++)
                grid[row][col] = random.nextInt(10);

        return grid;
    }

    public static void main(String... args) {
        Random random = new Random();
        Matrix m = new Matrix();
        Matrix n = new Matrix(random.nextInt(7));
        Matrix o = new Matrix(random.nextInt(7), random.nextInt(7));
        System.out.println("First matrix:");
        System.out.print(m);
        System.out.println("Second matrix:");
        System.out.println(n);
        System.out.println("Third matrix:");
        System.out.println(o);

        if (m.isSameSize(n))
            System.out.println("First two are the same size");
        else
            System.out.println("First two are not the same size");

        if (o.isSquare())
            System.out.println("All three are square matrices");
        else
            System.out.println("Only first two are square matrices");

        n.add(o);
        System.out.println(n);
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM