mathjs/test/function/matrix/reshape.test.js

109 lines
4.1 KiB
JavaScript

var assert = require('assert'),
error = require('../../../lib/error/index'),
math = require('../../../index'),
Matrix = math.type.Matrix;
describe('reshape', function() {
it('should reshape an array', function() {
var array = [[0,1,2],[3,4,5]];
assert.deepEqual(math.reshape(array, [3, 2]), [[0,1], [2,3], [4,5]]);
});
it('should reshape an array with bignumbers', function() {
var zero = math.bignumber(0);
var one = math.bignumber(1);
var two = math.bignumber(2);
var three = math.bignumber(3);
var array = [zero, one, two, three];
assert.deepEqual(math.reshape(array, [two, two]),
[[zero,one], [two, three]]);
});
it('should reshape a matrix', function() {
var matrix = math.matrix([[0,1,2],[3,4,5]]);
assert.deepEqual(math.reshape(matrix, [3, 2]),
math.matrix([[0,1], [2,3], [4,5]]));
assert.deepEqual(math.reshape(matrix, math.matrix([3, 2])),
math.matrix([[0,1], [2,3], [4,5]]));
});
it('should reshape a flat single-element array into multiple dimensions', function() {
var array = [3];
assert.deepEqual(math.reshape(array, [1, 1, 1]), [[[3]]]);
});
it('should reshape a vector into a 2d matrix', function() {
var math2 = math.create({matrix: 'Array'});
assert.deepEqual(math2.reshape([1,2,3,4,5,6], [3,2]), [[1, 2], [3, 4], [5, 6]]);
});
it('should reshape 2d matrix into a vector', function() {
var math2 = math.create({matrix: 'Array'});
assert.deepEqual(math2.reshape([[1,2],[3,4],[5,6]], [6]), [1,2,3,4,5,6]);
});
it('should throw an error on invalid arguments', function() {
assert.throws(function () {math.reshape()}, /Too few arguments/);
assert.throws(function () {math.reshape([])}, /Too few arguments/);
assert.throws(function () {math.reshape([], 2)}, TypeError);
assert.throws(function () {math.reshape([], [], 4)}, /Too many arguments/);
assert.throws(function () {math.reshape([], ['no number'])}, /Invalid size/);
assert.throws(function () {math.reshape([], [2.3])}, /Invalid size/);
assert.throws(function () {math.reshape([1, 2], [])}, error.DimensionError);
assert.throws(function () {math.reshape([1, 2], [0])}, error.DimensionError);
assert.throws(function () {math.reshape([1, 2], [0,0])}, error.DimensionError);
assert.throws(function () {math.reshape([[1, 2]], [0])}, error.DimensionError);
assert.doesNotThrow(function () {math.reshape([[1, 2]], [2,1])});
assert.doesNotThrow(function () {math.reshape([[1, 2]], [2])});
});
it('should LaTeX reshape', function () {
var expression = math.parse('reshape([1,2],1)');
assert.equal(expression.toTex(), '\\mathrm{reshape}\\left(\\begin{bmatrix}1\\\\2\\\\\\end{bmatrix},1\\right)');
});
it('should reshape a SparseMatrix', function() {
/*
* Must use toArray because SparseMatrix.reshape currently does not preserve
* the order of the _index and _values arrays (this does not matter?)
*/
var matrix = math.matrix([[0,1,2],[3,4,5]], 'sparse');
assert.deepEqual(math.reshape(matrix, [3, 2]).toArray(),
[[0,1], [2,3], [4,5]]);
assert.deepEqual(math.reshape(matrix, [6, 1]).toArray(),
[[0],[1],[2],[3],[4],[5]]);
assert.deepEqual(math.reshape(matrix, [1, 6]).toArray(),
[[0,1,2,3,4,5]]);
matrix = math.matrix([[0,1,2,3,4,5]], 'sparse');
assert.deepEqual(math.reshape(matrix, [3, 2]).toArray(),
[[0,1], [2,3], [4,5]]);
matrix = math.matrix([[0],[1],[2],[3],[4],[5]], 'sparse');
assert.deepEqual(math.reshape(matrix, [3, 2]).toArray(),
[[0,1], [2,3], [4,5]]);
});
it('should throw on attempting to reshape an ImmutableDenseMatrix', function() {
var immutableMatrix = new math.type.ImmutableDenseMatrix([[1,2],[3,4]]);
assert.throws(function() { math.reshape(immutableMatrix, [1, 4]); },
/Cannot invoke reshape on an Immutable Matrix instance/);
});
it('should throw on attempting to reshape a Matrix (abstract type)', function() {
var matrix = new math.type.Matrix([[1,2],[3,4]]);
assert.throws(function() { math.reshape(matrix, [1, 4]); },
/Cannot invoke reshape on a Matrix interface/);
});
});