diff.js (5868B)
1 "use strict"; 2 3 Object.defineProperty(exports, "__esModule", { 4 value: true 5 }); 6 exports.createDiff = void 0; 7 8 var _factory = require("../../utils/factory.js"); 9 10 var _number = require("../../utils/number.js"); 11 12 var _is = require("../../utils/is.js"); 13 14 var name = 'diff'; 15 var dependencies = ['typed', 'matrix', 'subtract', 'number']; 16 var createDiff = /* #__PURE__ */(0, _factory.factory)(name, dependencies, function (_ref) { 17 var typed = _ref.typed, 18 matrix = _ref.matrix, 19 subtract = _ref.subtract, 20 number = _ref.number; 21 22 /** 23 * Create a new matrix or array of the difference between elements of the given array 24 * The optional dim parameter lets you specify the dimension to evaluate the difference of 25 * If no dimension parameter is passed it is assumed as dimension 0 26 * 27 * Dimension is zero-based in javascript and one-based in the parser and can be a number or bignumber 28 * Arrays must be 'rectangular' meaning arrays like [1, 2] 29 * If something is passed as a matrix it will be returned as a matrix but other than that all matrices are converted to arrays 30 * 31 * Syntax: 32 * 33 * math.diff(arr) 34 * math.diff(arr, dim) 35 * 36 * Examples: 37 * 38 * const arr = [1, 2, 4, 7, 0] 39 * math.diff(arr) // returns [1, 2, 3, -7] (no dimension passed so 0 is assumed) 40 * math.diff(math.matrix(arr)) // returns math.matrix([1, 2, 3, -7]) 41 * 42 * const arr = [[1, 2, 3, 4, 5], [1, 2, 3, 4, 5], [9, 8, 7, 6, 4]] 43 * math.diff(arr) // returns [[0, 0, 0, 0, 0], [8, 6, 4, 2, -1]] 44 * math.diff(arr, 0) // returns [[0, 0, 0, 0, 0], [8, 6, 4, 2, -1]] 45 * math.diff(arr, 1) // returns [[1, 1, 1, 1], [1, 1, 1, 1], [-1, -1, -1, -2]] 46 * math.diff(arr, math.bignumber(1)) // returns [[1, 1, 1, 1], [1, 1, 1, 1], [-1, -1, -1, -2]] 47 * 48 * math.diff(arr, 2) // throws RangeError as arr is 2 dimensional not 3 49 * math.diff(arr, -1) // throws RangeError as negative dimensions are not allowed 50 * 51 * // These will all produce the same result 52 * math.diff([[1, 2], [3, 4]]) 53 * math.diff([math.matrix([1, 2]), math.matrix([3, 4])]) 54 * math.diff([[1, 2], math.matrix([3, 4])]) 55 * math.diff([math.matrix([1, 2]), [3, 4]]) 56 * // They do not produce the same result as math.diff(math.matrix([[1, 2], [3, 4]])) as this returns a matrix 57 * 58 * See Also: 59 * 60 * sum 61 * subtract 62 * partitionSelect 63 * 64 * @param {Array | Matrix} arr An array or matrix 65 * @param {number} dim Dimension 66 * @return {Array | Matrix} Difference between array elements in given dimension 67 */ 68 return typed(name, { 69 'Array | Matrix': function ArrayMatrix(arr) { 70 // No dimension specified => assume dimension 0 71 if ((0, _is.isMatrix)(arr)) { 72 return matrix(_diff(arr.toArray())); 73 } else { 74 return _diff(arr); 75 } 76 }, 77 'Array | Matrix, number': function ArrayMatrixNumber(arr, dim) { 78 if (!(0, _number.isInteger)(dim)) throw new RangeError('Dimension must be a whole number'); 79 80 if ((0, _is.isMatrix)(arr)) { 81 return matrix(_recursive(arr.toArray(), dim)); 82 } else { 83 return _recursive(arr, dim); 84 } 85 }, 86 'Array | Matrix, BigNumber': function ArrayMatrixBigNumber(arr, dim) { 87 return this(arr, number(dim)); 88 } 89 }); 90 /** 91 * Recursively find the correct dimension in the array/matrix 92 * Then Apply _diff to that dimension 93 * 94 * @param {Array} arr The array 95 * @param {number} dim Dimension 96 * @return {Array} resulting array 97 */ 98 99 function _recursive(arr, dim) { 100 if ((0, _is.isMatrix)(arr)) { 101 arr = arr.toArray(); // Makes sure arrays like [ matrix([0, 1]), matrix([1, 0]) ] are processed properly 102 } 103 104 if (!Array.isArray(arr)) { 105 throw RangeError('Array/Matrix does not have that many dimensions'); 106 } 107 108 if (dim > 0) { 109 var result = []; 110 arr.forEach(function (element) { 111 result.push(_recursive(element, dim - 1)); 112 }); 113 return result; 114 } else if (dim === 0) { 115 return _diff(arr); 116 } else { 117 throw RangeError('Cannot have negative dimension'); 118 } 119 } 120 /** 121 * Difference between elements in the array 122 * 123 * @param {Array} arr An array 124 * @return {Array} resulting array 125 */ 126 127 128 function _diff(arr) { 129 var result = []; 130 var size = arr.length; 131 132 if (size < 2) { 133 return arr; 134 } 135 136 for (var i = 1; i < size; i++) { 137 result.push(_ElementDiff(arr[i - 1], arr[i])); 138 } 139 140 return result; 141 } 142 /** 143 * Difference between 2 objects 144 * 145 * @param {Object} obj1 First object 146 * @param {Object} obj2 Second object 147 * @return {Array} resulting array 148 */ 149 150 151 function _ElementDiff(obj1, obj2) { 152 // Convert matrices to arrays 153 if ((0, _is.isMatrix)(obj1)) obj1 = obj1.toArray(); 154 if ((0, _is.isMatrix)(obj2)) obj2 = obj2.toArray(); 155 var obj1IsArray = Array.isArray(obj1); 156 var obj2IsArray = Array.isArray(obj2); 157 158 if (obj1IsArray && obj2IsArray) { 159 return _ArrayDiff(obj1, obj2); 160 } 161 162 if (!obj1IsArray && !obj2IsArray) { 163 return subtract(obj2, obj1); // Difference is (second - first) NOT (first - second) 164 } 165 166 throw TypeError('Cannot calculate difference between 1 array and 1 non-array'); 167 } 168 /** 169 * Difference of elements in 2 arrays 170 * 171 * @param {Array} arr1 Array 1 172 * @param {Array} arr2 Array 2 173 * @return {Array} resulting array 174 */ 175 176 177 function _ArrayDiff(arr1, arr2) { 178 if (arr1.length !== arr2.length) { 179 throw RangeError('Not all sub-arrays have the same length'); 180 } 181 182 var result = []; 183 var size = arr1.length; 184 185 for (var i = 0; i < size; i++) { 186 result.push(_ElementDiff(arr1[i], arr2[i])); 187 } 188 189 return result; 190 } 191 }); 192 exports.createDiff = createDiff;