mathjs
Version:
Math.js is an extensive math library for JavaScript and Node.js. It features a flexible expression parser and offers an integrated solution to work with numbers, big numbers, complex numbers, units, and matrices.
115 lines (102 loc) • 3.06 kB
JavaScript
module.exports = function (math, config) {
var util = require('../../util/index'),
BigNumber = math.type.BigNumber,
Matrix = require('../../type/Matrix'),
array = util.array,
clone = util.object.clone,
string = util.string,
isString = util.string.isString,
isNumber = util.number.isNumber,
isInteger = util.number.isInteger,
isArray = array.isArray;
/**
* Resize a matrix
*
* resize(x, size)
* resize(x, size, defaultValue)
*
* @param {* | Array | Matrix} x
* @param {Array | Matrix} size One dimensional array with numbers
* @param {Number | String} [defaultValue] Undefined by default, except in
* case of a string, in that case
* defaultValue = ' '
* @return {* | Array | Matrix} res
*/
math.resize = function resize (x, size, defaultValue) {
if (arguments.length != 2 && arguments.length != 3) {
throw new math.error.ArgumentsError('resize', arguments.length, 2, 3);
}
var asMatrix = (x instanceof Matrix) ? true : isArray(x) ? false : (config.matrix !== 'array');
if (x instanceof Matrix) {
x = x.valueOf(); // get Array
}
if (size instanceof Matrix) {
size = size.valueOf(); // get Array
}
if (size.length && size[0] instanceof BigNumber) {
// convert bignumbers to numbers
size = size.map(function (value) {
return (value instanceof BigNumber) ? value.toNumber() : value;
});
}
if (isString(x)) {
return _resizeString(x, size, defaultValue);
}
else {
if (size.length == 0) {
// output a scalar
while (isArray(x)) {
x = x[0];
}
return clone(x);
}
else {
// output an array/matrix
if (!isArray(x)) {
x = [x];
}
x = clone(x);
var res = array.resize(x, size, defaultValue);
return asMatrix ? new Matrix(res) : res;
}
}
};
/**
* Resize a string
* @param {String} str
* @param {Number[]} size
* @param {string} defaultChar
* @private
*/
function _resizeString(str, size, defaultChar) {
if (defaultChar !== undefined) {
if (!isString(defaultChar) || defaultChar.length !== 1) {
throw new TypeError('Single character expected as defaultValue');
}
}
else {
defaultChar = ' ';
}
if (size.length !== 1) {
throw new math.error.DimensionError(size.length, 1);
}
var len = size[0];
if (!isNumber(len) || !isInteger(len)) {
throw new TypeError('Invalid size, must contain positive integers ' +
'(size: ' + string.format(size) + ')');
}
if (str.length > len) {
return str.substring(0, len);
}
else if (str.length < len) {
var res = str;
for (var i = 0, ii = len - str.length; i < ii; i++) {
res += defaultChar;
}
return res;
}
else {
return str;
}
}
};