Implemented method squeeze

This commit is contained in:
josdejong 2013-03-28 21:44:29 +01:00
parent b07920fac8
commit 5ea8366d3e
10 changed files with 157 additions and 13 deletions

View File

@ -7,7 +7,7 @@ https://github.com/josdejong/mathjs
*Note: version 0.5 is incompatible with previous versions.*
- Implemented data types Matrix and Range.
- Implemented methods clone, size, identity.
- Implemented methods clone, diag, size, squeeze, identity.
- Changed: moved all type constructors in the namespace under math.type,
created construction methods for easy object creation. For example, a complex
value is now created with "math.complex(2, 3)" instead of

75
math.js
View File

@ -4834,7 +4834,7 @@ diag.doc = {
'diag(a)'
],
'seealso': [
'identity', 'ones', 'range', 'size', 'transpose', 'zeros'
'identity', 'ones', 'range', 'size', 'squeeze', 'transpose', 'zeros'
]
};
/**
@ -4903,7 +4903,7 @@ identity.doc = {
'identity(size(a))'
],
'seealso': [
'diag', 'ones', 'range', 'size', 'transpose', 'zeros'
'diag', 'ones', 'range', 'size', 'squeeze', 'transpose', 'zeros'
]
};
/**
@ -4958,7 +4958,7 @@ ones.doc = {
'ones(size(a))'
],
'seealso': [
'diag', 'identity', 'range', 'size', 'transpose', 'zeros'
'diag', 'identity', 'range', 'size', 'squeeze', 'transpose', 'zeros'
]
};
/**
@ -5014,6 +5014,73 @@ size.doc = {
'size(a)',
'size(1:6)'
],
'seealso': [
'diag', 'identity', 'ones', 'range', 'squeeze', 'transpose', 'zeros'
]
};
/**
* Remove singleton dimensions from a matrix. squeeze(x)
* @param {Matrix | Array} x
* @return {Matrix | Array} res
*/
function squeeze (x) {
if (arguments.length != 1) {
throw newArgumentsError('squeeze', arguments.length, 1);
}
if (x instanceof Matrix || x instanceof Range) {
return _squeezeArray(x.toArray());
}
else if (x instanceof Array) {
return _squeezeArray(clone(x));
}
else {
// scalar
return clone(x);
}
}
math.squeeze = squeeze;
/**
* Recursively squeeze a multi dimensional array
* @param {Array} array
* @return {Array} array
* @private
*/
function _squeezeArray(array) {
if (array.length == 1) {
// squeeze this array
return _squeezeArray(array[0]);
}
else {
// process all childs
for (var i = 0, len = array.length; i < len; i++) {
var child = array[i];
if (child instanceof Array) {
array[i] = _squeezeArray(child);
}
}
return array;
}
}
/**
* Function documentation
*/
squeeze.doc = {
'name': 'squeeze',
'category': 'Numerics',
'syntax': [
'squeeze(x)'
],
'description': 'Remove singleton dimensions from a matrix.',
'examples': [
'a = zeros(1,3,2)',
'size(squeeze(a))',
'b = zeros(3,1,1)',
'size(squeeze(b))'
],
'seealso': [
'diag', 'identity', 'ones', 'range', 'transpose', 'zeros'
]
@ -5068,7 +5135,7 @@ zeros.doc = {
'zeros(size(a))'
],
'seealso': [
'diag', 'identity', 'ones', 'range', 'size', 'transpose'
'diag', 'identity', 'ones', 'range', 'size', 'squeeze', 'transpose'
]
};
/**

6
math.min.js vendored

File diff suppressed because one or more lines are too long

View File

@ -98,6 +98,6 @@ diag.doc = {
'diag(a)'
],
'seealso': [
'identity', 'ones', 'range', 'size', 'transpose', 'zeros'
'identity', 'ones', 'range', 'size', 'squeeze', 'transpose', 'zeros'
]
};

View File

@ -64,6 +64,6 @@ identity.doc = {
'identity(size(a))'
],
'seealso': [
'diag', 'ones', 'range', 'size', 'transpose', 'zeros'
'diag', 'ones', 'range', 'size', 'squeeze', 'transpose', 'zeros'
]
};

View File

@ -50,6 +50,6 @@ ones.doc = {
'ones(size(a))'
],
'seealso': [
'diag', 'identity', 'range', 'size', 'transpose', 'zeros'
'diag', 'identity', 'range', 'size', 'squeeze', 'transpose', 'zeros'
]
};

View File

@ -52,6 +52,6 @@ size.doc = {
'size(1:6)'
],
'seealso': [
'diag', 'identity', 'ones', 'range', 'transpose', 'zeros'
'diag', 'identity', 'ones', 'range', 'squeeze', 'transpose', 'zeros'
]
};

View File

@ -0,0 +1,67 @@
/**
* Remove singleton dimensions from a matrix. squeeze(x)
* @param {Matrix | Array} x
* @return {Matrix | Array} res
*/
function squeeze (x) {
if (arguments.length != 1) {
throw newArgumentsError('squeeze', arguments.length, 1);
}
if (x instanceof Matrix || x instanceof Range) {
return _squeezeArray(x.toArray());
}
else if (x instanceof Array) {
return _squeezeArray(clone(x));
}
else {
// scalar
return clone(x);
}
}
math.squeeze = squeeze;
/**
* Recursively squeeze a multi dimensional array
* @param {Array} array
* @return {Array} array
* @private
*/
function _squeezeArray(array) {
if (array.length == 1) {
// squeeze this array
return _squeezeArray(array[0]);
}
else {
// process all childs
for (var i = 0, len = array.length; i < len; i++) {
var child = array[i];
if (child instanceof Array) {
array[i] = _squeezeArray(child);
}
}
return array;
}
}
/**
* Function documentation
*/
squeeze.doc = {
'name': 'squeeze',
'category': 'Numerics',
'syntax': [
'squeeze(x)'
],
'description': 'Remove singleton dimensions from a matrix.',
'examples': [
'a = zeros(1,3,2)',
'size(squeeze(a))',
'b = zeros(3,1,1)',
'size(squeeze(b))'
],
'seealso': [
'diag', 'identity', 'ones', 'range', 'transpose', 'zeros'
]
};

View File

@ -48,6 +48,6 @@ zeros.doc = {
'zeros(size(a))'
],
'seealso': [
'diag', 'identity', 'ones', 'range', 'size', 'transpose'
'diag', 'identity', 'ones', 'range', 'size', 'squeeze', 'transpose'
]
};

View File

@ -79,3 +79,13 @@ assert.deepEqual(math.diag([[1,2,3],[4,5,6]],-1).valueOf(), [4]);
assert.deepEqual(math.diag([[1,2,3],[4,5,6]],-2).valueOf(), []);
assert.deepEqual(math.diag(math.range(1,3)).valueOf(), [[1,0,0],[0,2,0],[0,0,3]]);
// TODO: test diag for all types of input (also scalar)
// test squeeze
m = math.ones(1,3,2);
assert.deepEqual(math.size(m).valueOf(), [1,3,2]);
assert.deepEqual(math.size(math.squeeze(m)).valueOf(), [3,2]);
m = math.ones(3,1,1);
assert.deepEqual(math.size(m).valueOf(), [3,1,1]);
assert.deepEqual(math.size(math.squeeze(m)).valueOf(), [3]);
assert.deepEqual(math.squeeze(2.3), 2.3);
assert.deepEqual(math.size(math.squeeze(math.range(1,5))), [5]);