2013-08-05 23:05:23 +02:00

103 lines
2.5 KiB
JavaScript

var error = require('../../util/error.js'),
collection = require('../../type/collection.js'),
array = require('../../util/array.js'),
Matrix = require('../../type/Matrix.js');
/**
* Compute the minimum value of a list of values
*
* min(a, b, c, ...)
* min([a, b, c, ...])
*
* @param {... *} args A single matrix or multiple scalars
* @return {*} res
*/
module.exports = function min(args) {
if (arguments.length == 0) {
throw new Error('Function min requires one or more parameters (0 provided)');
}
if (collection.isCollection(args)) {
// min([a, b, c, d, ...]])
if (arguments.length > 1) {
throw Error('Wrong number of parameters (1 matrix or multiple scalars expected)');
}
var size = array.size(args.valueOf());
if (size.length == 1) {
// vector
if (args.length == 0) {
throw new Error('Cannot calculate min of an empty vector');
}
return _min(args.valueOf());
}
else if (size.length == 2) {
// 2 dimensional matrix
if (size[0] == 0 || size[1] == 0) {
throw new Error('Cannot calculate min of an empty matrix');
}
// TODO: make a generic collection method for this
if (Matrix.isMatrix(args)) {
return new Matrix(_min2(args.valueOf(), size[0], size[1]));
}
else {
return _min2(args, size[0], size[1]);
}
}
else {
// TODO: implement min for n-dimensional matrices
throw new RangeError('Cannot calculate min for multi dimensional matrix');
}
}
else {
// min(a, b, c, d, ...)
return _min(arguments);
}
};
/**
* Calculate the min of a one dimensional array
* @param {Array} array
* @return {Number} min
* @private
*/
function _min(array) {
var res = array[0];
for (var i = 1, iMax = array.length; i < iMax; i++) {
var value = array[i];
if (smaller(value, res)) {
res = value;
}
}
return res;
}
/**
* Calculate the min of a two dimensional array
* @param {Array} array
* @param {Number} rows
* @param {Number} cols
* @return {Number[]} min
* @private
*/
function _min2(array, rows, cols) {
var res = [];
for (var c = 0; c < cols; c++) {
var min = array[0][c];
for (var r = 1; r < rows; r++) {
var value = array[r][c];
if (smaller(value, min)) {
min = value;
}
}
res[c] = min;
}
return res;
}
// require after module.exports because of possible circular references
var smaller = require('../arithmetic/smaller.js');