实现Matrix类，包括Matrix的加减乘运算。

## Matrix Class

A matrix is rectangular array of items laid out in rows and columns. The dimensions, or size, of a matrix can be expressed as m x n or m-by-n, where m is the number of rows in the matrix and n is the number of columns in the matrix.

For example, consider A, which is the following 2 x 4 matrix:

```
[5 1 2 3]
[3 4 4 1]
```

The individual elements in A can be expressed as ai,j, where i (the row) is a number from 1 to m and j (the column) is a number from 1 to n. For example, the value at element a1,3 is 2.

Write a program (called matrix.cpp) that does that following:

Implement a class called Matrix that:

- Contains private member fields:
- int rows
- int columns
- Either an int* data or int** data
- You can use either of the two methods we discussed in class to implement the dynamic 2D array of integers

- Contains a non-default constructor
- Constructor that accepts the row and column information, and dynamically creates the matrix (using new, assign this to data)

- Contains a destructor
- That properly handles discarding the dynamically created 2D array (using delete[])

- Contains a copy constructor
- The copy constructor should perform a deep copy of the Matrix’s member fields

- Overloads the following operators as public member functions
- operator+
- adds two same sized Matrix objects together and returns a Matrix object that contains the sum

- operator-
- subtracts two same sized Matrix objects together and returns a Matrix object with the difference

- operator*
- performs proper matrix multiplication on any two Matrix objects and returns a Matrix object with the product
- performs scalar multiplication between an integer value and a Matrix object, and returns a Matrix object with the product
- You will need to overload operator* a total of 3 times
- Matrix * Matrix
- int * Matrix
- Matrix * int

- operator+
- Contains the two public functions
- Getter function for rows
- Getter function for columns
- Both should be implemented as const functions

- Publicly declares the
`operator<<`

function as a friend of the class Matrix- Be certain that the return type of the function is ostream&
- Accepts a Matrix& as its second parameter

Outside for class definition, write the global function definition for `operator<<`

function that:

- Outputs the contents of the matrix in tabular form that matches the dimensions of the matrix

Implement the main function such that:

- Prompts the user for:
- The dimensions of a first matrix, which are passed to the constructor when creating the first Matrix object
- The contents of the first Matrix object, which is collected after the object is already created (simplest method is to complete the
`operator>>`

function provided in the matrix_template.cpp file) - The dimensions of a second matrix, which are passed to the constructor when creating the second Matrix object
- The contents of the second Matrix object, which is collected after the object is already created (simplest method is to complete the
`operator>>`

function provided in the matrix_template.cpp file)

Sample prompts with appropriate user responses:

```
Number of Rows in Matrix 1: 5
Number of Columns in Matrix 1: 2
Values of Matrix 1 (expecting 10): 6 7 10 3 5 31 0 9 2 7
Number of Rows in Matrix 2: 5
Number of Columns in Matrix 2: 2
Values of Matrix 2 (expecting 10): 13 1 7 41 9 8 12 3 4 0
```

Note: You must use the above format for entering the values of the matrix. When entering values to fill a matrix, all values should be provided on one line.

- Performs the following calculations and prints each result using the overloaded
`<< operator`

- Each of the five matrix mathematical methods should be called, each result stored in a new object
- If the dimensions of the two matrices involved do not allow for the operation to be performed, skip performing this calculation, and display a message stating that step has been skipped.
- For example, if I have a 3x4 matrix and a 4x2 matrix, I cannot add or subtract these together, but I can perform multiplication

- Each calculation should be printed with a full explanation
- For scalar multiplication, be sure print the value of the integer value as part of the output when performing this function.
- The calculation being performed should be explained; and the contents of each matrix or value involved should be printed and identified.

### General Guidelines

- All functions that accept a Matrix object as a parameter, that parameter should be passed by reference
- Use the matrix_template.cpp file in Canvas as the starting point for your program
- When performing calculations such as addition/subtraction/multiplication, be certain to initial the object with the functions’ return value, do not declare the object beforehand and assign it afterwards

Do not do this:

1 | Matrix sum; |

Do this:

1 | Matrix sum = m1 + m2; |

## Compiling the Program

Use the following command to compile your program:

```
g++ <program_name.cpp> -Wall -std=c++03 -pedantic -o <output_name>
```

Example:

```
g++ matrix.cpp -Wall -std=c++03 -pedantic -o matrix
```

Remember: In order to be considered for grading, your submitted programs must compile successfully without any errors. If your programs fail to compile, an initial grade of a zero will be given for that program.