-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMatrix.java
118 lines (95 loc) · 3.92 KB
/
Matrix.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
package pkg3dlidar;
/**
* @author Nicklas Boserup
*/
public class Matrix {
private final double[][] matrix;
public Matrix(int rows, int columns) {
matrix = new double[rows][columns];
}
public Matrix(double[]... rows) {
this(rows.length, rows[0].length); // Each row includes row[0].length columns
for (int row = 0; row < rows.length; row++) {
matrix[row] = rows[row];
}
}
public int getNumberOfRows() {
return matrix.length;
}
public int getNumberOfColumns() {
return matrix[0].length;
}
public double getValue(int row, int column) {
return matrix[row][column];
}
public double[] getRow(int row) {
return matrix[row];
}
public double[] getColumn(int column) {
double[] columnArray = new double[getNumberOfRows()];
for (int row = 0; row < getNumberOfRows(); row++) {
columnArray[row] = matrix[row][column];
}
return columnArray;
}
public Matrix transform() {
Matrix result = new Matrix(getNumberOfColumns(), getNumberOfRows());
for (int row = 0; row < getNumberOfRows(); row++) {
for (int column = 0; column < getNumberOfColumns(); column++) {
result.matrix[column][row] = matrix[row][column];
}
}
return result;
}
public Matrix add(Matrix toAdd) {
if (getNumberOfRows() != toAdd.getNumberOfRows() || getNumberOfColumns() != toAdd.getNumberOfColumns())
throw new IllegalArgumentException("The two matrices must have the same number of dimensions");
Matrix result = new Matrix(getNumberOfRows(), getNumberOfColumns());
for (int row = 0; row < getNumberOfRows(); row++) {
for (int column = 0; column < getNumberOfColumns(); column++) {
result.matrix[row][column] = matrix[row][column] + toAdd.matrix[row][column];
}
}
return result;
}
public Matrix multiplyScalar(double scalar) {
Matrix result = new Matrix(getNumberOfRows(), getNumberOfColumns());
for (int row = 0; row < getNumberOfRows(); row++) {
for (int column = 0; column < getNumberOfColumns(); column++) {
result.matrix[row][column] = matrix[row][column] * scalar;
}
}
return result;
}
public double dotProduct(double[] vector1, double[] vector2) {
if (vector1.length != vector2.length || vector1.length == 0)
throw new IllegalArgumentException("The two vectors must have the same (non-zero) number of members");
double dot = 0;
for (int i = 0; i < vector1.length; i++)
dot += vector1[i] * vector2[i];
return dot;
}
public Matrix multiplyMatrix(Matrix toMultiply) {
if (getNumberOfColumns()!= toMultiply.getNumberOfRows())
throw new IllegalArgumentException("The matrix must have the same number of rows as toMultiply's number of columns");
Matrix result = new Matrix(getNumberOfRows(), toMultiply.getNumberOfColumns());
for (int row = 0; row < getNumberOfRows(); row++) {
for (int column = 0; column < toMultiply.getNumberOfColumns(); column++) {
result.matrix[row][column] = dotProduct(getRow(row), toMultiply.getColumn(column));
}
}
return result;
}
@Override
public String toString() {
String s = "";
for (int row = 0; row < getNumberOfRows(); row++) {
s += row == 0 ? "⸢" : row == matrix.length-1 ? "⸤" : "|";
for (int column = 0; column < getNumberOfColumns(); column++) {
s += "\t" + matrix[row][column] + "\t";
}
s += row == 0 ? "⸣\n" : row == matrix.length-1 ? "⸥" : "|\n";
}
return s;
}
}