Added full reduce capabilities not tested

This commit is contained in:
Guillermo Indalecio Fernandez 2013-10-22 10:48:11 +02:00
parent 608462c843
commit 8db830c31d

View File

@ -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.