mirror of
https://github.com/josdejong/mathjs.git
synced 2026-01-25 15:07:57 +00:00
Added full reduce capabilities not tested
This commit is contained in:
parent
608462c843
commit
8db830c31d
@ -146,6 +146,64 @@ exports.deepMap2 = function deepMap2(array1, array2, callback) {
|
||||
return res;
|
||||
};
|
||||
|
||||
/**
|
||||
* Reduce the given array to a scalar, applying a callback function to
|
||||
* each pair of values, in the selected dimension.
|
||||
* @param {Array | Matrix} mat
|
||||
* @param {Integer} dimension
|
||||
* @param {function} callback
|
||||
* @return {Array | Matrix} res
|
||||
*/
|
||||
exports.reduce = function reduce (mat, dim, callback) {
|
||||
if (mat instanceof Matrix) {
|
||||
mat = mat.valueOf();
|
||||
}
|
||||
return _reduce(mat, dim, callback);
|
||||
}
|
||||
|
||||
function _reduce(mat, dim, callback){
|
||||
if(dim<=0){
|
||||
if( typeof mat[0] === "number" ){
|
||||
var i;
|
||||
var val = mat[0];
|
||||
for(i=0; i<mat.length; i++){
|
||||
val = callback(val, mat[i]);
|
||||
}
|
||||
return val;
|
||||
}else{
|
||||
var tran = _switch(mat);
|
||||
var i;
|
||||
var ret = [];
|
||||
for(i=0; i<tran.length; i++){
|
||||
ret[i] = _reduce(tran[i], dim-1, callback);
|
||||
}
|
||||
return ret
|
||||
}
|
||||
}else{
|
||||
var i;
|
||||
var ret = [];
|
||||
for(i=0; i<mat.length; i++){
|
||||
ret[i] = _reduce(mat[i], dim-1, callback);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
function _switch(mat){
|
||||
var I = mat.length;
|
||||
var J = mat[0].length;
|
||||
var i, j;
|
||||
var ret = new Array();
|
||||
for( j=0; j<J; j++) {
|
||||
var tmp = new Array();
|
||||
for( i=0; i<I; i++) {
|
||||
tmp.push(mat[i][j]);
|
||||
}
|
||||
ret.push(tmp);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* Recursively loop over all elements in a given multi dimensional array
|
||||
* and invoke the callback on each of the elements.
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user