The code that I am sharing here for you to review today, is a segment of a JavaScript library that I am going to write as time goes by for fun. It is only the two functions in the following code: /*jslint browser: true, indent: 8 */ /*global console */ /* Sorts matrix like from something like this: [ [0, 0, 0], [0, 0, 0], [0, 2, 1], [0, 1, 3], [1, 2, 3], [0, 0, 3] ] to this: [ [1, 2, 3], [0, 1, 3], [0, 2, 1], [0, 0, 0], [0, 0, 0], [0, 0, 3] ] The reason why the [0, 0, 3] is last is because the vector has the length of 3, so only 3 vectors are sorted and the rest (irrelevent vectors) are appended later. */ function sort_reduced_matrix(matrix) { 'use strict'; var i, j, len, has_pivot, irrelevant, positions, new_matrix, count; len = {}; len.i = matrix.length; // matrix length (row) len.j = matrix[0].length; // vector length (column) positions = []; has_pivot = []; // Find pivot positions for (j = 0; j < len.j; j += 1) { for (i = 0; i < len.i; i += 1) { if (matrix[i][j] === 1 && has_pivot[i] !== i) { has_pivot[i] = i; positions[positions.length] = i; break; } } } irrelevant = []; count = 0; // Find irrelevant vectors positions for (i = 0; i < len.i; i += 1) { if (has_pivot[i] === undefined) { irrelevant[count] = i; count += 1; } } new_matrix = []; count = 0; // Sort positions for (i = 0; i < len.i; i += 1) { if (matrix[positions[i]] !== undefined) { new_matrix[i] = matrix[positions[i]]; } else { new_matrix[i] = matrix[irrelevant[count]]; count += 1; } } return new_matrix; } function reduced_row_echolon_form(matrix) { 'use strict'; var i, p, tmp, len, mu, mv; len = {}; // Length. i = {}; // Increment. tmp = {}; // Temporary holder. p = {}; // Position. len.r = matrix.length; // Row, length. len.c = matrix[0].length; // column, length. i.r = 0; // Row, increment. i.r2 = 0; // Row2, increment. i.c = 0; // Column, increment. tmp.v = []; // Vector, temporary holder. tmp.p = 0; // pivot value. p.lp = 0; // Lead pivot, position. p.rpd = []; // Reserved positions direct, position. // Find lead pivots in matrix. for (i.r = 0; i.r < len.r; i.r += 1) { p.lp = null; // Get lead pivot position. for (i.c = 0; i.c < len.c; i.c += 1) { /* If position is not reserved nor is zero, then that is * our leading pivot. */ if (matrix[i.r][i.c] !== 0 && p.rpd[i.c] === undefined) { p.lp = i.c; break; } } if (p.lp !== null) { // Reserve lead pivot position. p.rpd[p.lp] = p.lp; // Reduce row such that the pivot is 1. if (matrix[i.r][p.lp] !== 1) { tmp.p = matrix[i.r][p.lp]; for (i.c = 0; i.c < len.c; i.c += 1) { matrix[i.r][i.c] /= tmp.p; } } /* Reduce other rows (i.r2) from row (i.r). */ for (i.r2 = 0; i.r2 < len.r; i.r2 += 1) { /* Skip row (i.r) and don't reduce if desired * value is already zero. */ if (i.r2 !== i.r && matrix[i.r2][p.lp] !== 0) { /* Scale row (i.r) using pivot position * from row (i.r2) as the multiplier. */ for (i.c = 0; i.c < len.c; i.c += 1) { tmp.v[i.c] = matrix[i.r][i.c]; tmp.v[i.c] *= matrix[i.r2][p.lp]; } // Row reduction. for (i.c = 0; i.c < len.c; i.c += 1) { matrix[i.r2][i.c] -= tmp.v[i.c]; } } } } } // Finally, we sort our rows, keeping zeros at the bottom and return. return sort_reduced_matrix(matrix); } // Compere this to wolframalpha.com answers. // answer: http://www.wolframalpha.com/input/?i=solve+row+echelon+form+{{5%2C+-7%2C+-8%2C+-4}%2C{2%2C+8%2C+-22%2C+-55}%2C+{-3%2C+0%2C+-36%2C+12}} var matrix = [ [5, -7, -8, -4], [2, 8, -22, -55], [-3, 0, -36, 12] ]; matrix = reduced_row_echolon_form(matrix); console.log(matrix); // answer: http://www.wolframalpha.com/input/?i=solve+row+echelon+form+{{5%2C+-23%2C+2%2C+4%2C+5%2C+11}%2C{4%2C+-3%2C+6%2C+4%2C+5%2C+2}%2C{3%2C+7%2C+-18%2C+7%2C+9%2C+-6}%2C{4%2C+87%2C+-12%2C+7%2C+12%2C+6}%2C{5%2C+4%2C+7%2C+11%2C+7%2C+-7}} matrix = [ [5, -23, 2, 4, 5, 11], [4, -3, 6, 4, 5, 2], [3, 7, -18, 7, 9, -6], [4, 87, -12, 7, 12, 6], [5, 4, 7, 11, 7, -7] ]; matrix = reduced_row_echolon_form(matrix); console.log(matrix[0]); console.log(matrix[1]); console.log(matrix[2]); console.log(matrix[3]); console.log(matrix[4]); // answer: http://www.wolframalpha.com/input/?i=solve+row+echelon+form+{{1%2C+2%2C+2%2C+2}%2C{1%2C+3%2C+3%2C+3}%2C+{1%2C+4%2C+16%2C+5}} matrix = [ [1, 2, 2, 2], [1, 3, 3, 3], [1, 4, 16, 5] ]; matrix = reduced_row_echolon_form(matrix); console.log(matrix); // answer: http://www.wolframalpha.com/input/?i=solve+row+echelon+form+{{0%2C+2%2C+-1%2C+-6}%2C{0%2C+3%2C+-2%2C+-16}%2C+{0%2C+0%2C+-3%2C+11}} matrix = [ [0, 2, -1, -6], [0, 3, -2, -16], [0, 0, -3, 11] ]; matrix = reduced_row_echolon_form(matrix); console.log(matrix); Is there something... 1. that I am doing in these two functions that you would consider as a bad practice and why? 2. that would explain why the code is slower than it needs to be? 3. that is just bad in some other way? I am not working as a programmer and I don't know anyone who makes a living as a programmer, so any hint or tips would be welcome.