-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathRREF.java
More file actions
152 lines (133 loc) · 4.14 KB
/
RREF.java
File metadata and controls
152 lines (133 loc) · 4.14 KB
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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
public class RREF {
/**
* Puts a matrix into reduced row echelon form
*
* @param matrix input matrix
*
* @return 2D result matrix
*/
public static double[][] rref(double[][] matrix){
int lead = 0;
int i;
// number of rows and columns in matrix
int numRows = matrix.length;
int numColumns = matrix[0].length;
for(int k = 0; k < numRows; k++){
if(numColumns <= lead){
break;
}
i = k;
while(matrix[i][lead] == 0){
i++;
if(numRows == i){
i = k;
lead++;
if(numColumns == lead){
break;
}
}
}
matrix = rowSwap(matrix, i, k);
if(matrix[k][lead] != 0){
matrix = rowScale(matrix, k, (1/matrix[k][lead]));
}
for(i = 0; i < numRows; i++){
if(i != k){
matrix = rowAddScale(matrix, k, i,((-1) * matrix[i][lead]));
}
}
lead++;
}
return matrix;
}
/**
* Swap positions of 2 rows
*
* @param matrix matrix before row additon
* @param rowIndex1 int index of row to swap
* @param rowIndex2 int index of row to swap
*
* @return matrix after row swap
*/
private static double[][] rowSwap(double[][] matrix, int rowIndex1,
int rowIndex2){
// number of columns in matrix
int numColumns = matrix[0].length;
// holds number to be swapped
double hold;
for(int k = 0; k < numColumns; k++){
hold = matrix[rowIndex2][k];
matrix[rowIndex2][k] = matrix[rowIndex1][k];
matrix[rowIndex1][k] = hold;
}
return matrix;
}
/**
* Adds 2 rows together row2 = row2 + row1
*
* @param matrix matrix before row additon
* @param rowIndex1 int index of row to be added
* @param rowIndex2 int index or row that row1 is added to
*
* @return matrix after row addition
*/
private static double[][] rowAdd(double[][] matrix, int rowIndex1,
int rowIndex2){
// number of columns in matrix
int numColumns = matrix[0].length;
for(int k = 0; k < numColumns; k++){
matrix[rowIndex2][k] += matrix[rowIndex1][k];
}
return matrix;
}
/**
* Multiplies a row by a scalar
*
* @param matrix matrix before row additon
* @param rowIndex int index of row to be scaled
* @param scalar double to scale row by
*
* @return matrix after row scaling
*/
private static double[][] rowScale(double[][] matrix, int rowIndex,
double scalar){
// number of columns in matrix
int numColumns = matrix[0].length;
for(int k = 0; k < numColumns; k++){
matrix[rowIndex][k] *= scalar;
}
return matrix;
}
/**
* Adds a row by the scalar of another row
* row2 = row2 + (row1 * scalar)
* @param matrix matrix before row additon
* @param rowIndex1 int index of row to be added
* @param rowIndex2 int index or row that row1 is added to
* @param scalar double to scale row by
*
* @return matrix after row addition
*/
private static double[][] rowAddScale(double[][] matrix, int rowIndex1,
int rowIndex2, double scalar){
// number of columns in matrix
int numColumns = matrix[0].length;
for(int k = 0; k < numColumns; k++){
matrix[rowIndex2][k] += (matrix[rowIndex1][k] * scalar);
}
return matrix;
}
public static void main(String args[])
{
double[][] matrix = {{3,1,-1},{2,-3,1}};
double [] [] solved = rref(matrix);
for(int i=0;i<matrix.length;i++)
{
for(int j=0; j<matrix[0].length;j++)
{
System.out.print(solved[i][j] + " ");
}
System.out.println();
}
}
}