Files
CS327-Discrete-Structures-II/Orbital-Bodies/Matrix.java

159 lines
4.6 KiB
Java
Raw Normal View History

2025-10-05 22:53:40 -04:00
/**
* A simple m x n matrix class.
*
* TODO All of the methods currently just return default values. You need to make them match the Javadoc comments.
*
* @author YOUR NAME HERE
* @version Sept. 2017
*/
public class Matrix {
private int m, n;
private double[][] M;
public Matrix(double[][] array) {
M = array;
m = array.length;
n = array[0].length;
}
/**
* @return The number of columns in the matrix.
*/
public int nCols() { return n; }
/**
* @return the number of rows.
*/
public int nRows() { return m; }
/**
* @param i
* @param j
* @return The entry at row i column j.
*/
public double entry(int i, int j) {
return M[i][j];
}
/**
* Computes the dot product of this matrix with the parameter that. (Return value is this . that)
* Recall that the dot product is the typical matrix multiplication.
* @param that The matrix to apply this matrix to.
* @throws BadDimensionException If this.nCols() != that.nRows() because the dot product is not defined
* @return The dot product of this matrix with that.
*/
public Matrix dot(Matrix that) throws UndefinedMatrixOpException {
if (this.nCols() != that.nRows()) {
throw new UndefinedMatrixOpException("Dot product not defined", this, that);
}
double[][] result = new double[this.nRows()][that.nCols()];
for (int i = 0; i < result.length; i++) {
for (int j = 0; j < result[i].length; j++) {
double entry = 0;
for (int k = 0; k < this.nCols(); k++) {
entry += this.entry(i, k) * that.entry(k, j);
}
result[i][j] = entry;
}
}
return new Matrix(result);
}
/**
* Add this matrix to that and returns the result. (Return value is this + that)
* @param that the matrix to add this matrix to.
* @throws BadDimensionException If the dimension of the two matrices are not identical.
* @return The sum of the this and that.
*/
public Matrix plus(Matrix that) throws UndefinedMatrixOpException {
if (this.nRows() != that.nRows() || this.nCols() != this.nRows()) {
throw new UndefinedMatrixOpException("Matrix dimensions are not identical", this, that);
}
double[][] result = new double[this.nRows()][this.nCols()];
for (int i = 0; i < result.length; i++) {
for (int j = 0; j < result[i].length; j++) {
result[i][j] = this.entry(i, j) + that.entry(i, j);
}
}
return new Matrix(result);
}
/**
* @param theta The rotation angle.
* @return The homogeneous rotation matrix for a given value for theta.
*/
public static Matrix rotationH2D(double theta) {
double[][] R = {{Math.cos(theta), -Math.sin(theta), 0}, {Math.sin(theta), Math.cos(theta), 0}, {0, 0, 1}};
return new Matrix(R);
}
/**
* @param tx The amount to translate in the x direction.
* @param ty The amount to translate in the y direction.
* @return The matrix representing a translation of tx, ty.
*/
public static Matrix translationH2D(double tx, double ty) {
double[][] T = {{1, 0, tx}, {0, 1, ty}, {0, 0, 1}};
return new Matrix(T);
}
/**
* @param x The x coordinate
* @param y The y coordinate
* @return The column matrix representing in homogeneous coordinates the point (x, y).
*/
public static Matrix vectorH2D(double x, double y) {
double[][] V = {{x}, {y}, {1}};
return new Matrix(V);
}
/**
* @param n The dimension of the matrix. Recall that the identity matrix has 1's for any entry that is in the same row index as its column index, 0's everywhere else.
* @return the nxn identity matrix
*/
public static Matrix identity(int n) {
return identity(n, n);
}
/**
* Computes the mxn identity matrix which has 1's for every entry at the same row and column index and
* 0 for all other entries.
* @param m
* @param n
* @return the mxn identity matrix.
*/
public static Matrix identity(int m, int n) {
double[][] result = new double[m][n];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
result[i][j] = (i == j) ? 1 : 0;
}
}
return new Matrix(result);
}
/**
* A little helpful toString() in case you want to print your matrix to System.out
*/
public String toString() {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
sb.append(M[i][j]);
sb.append('\t');
}
sb.append('\n');
}
return sb.toString();
}
}