Implemented transpose

This commit is contained in:
josdejong 2013-04-03 22:32:07 +02:00
parent 78bf9dbf4a
commit 2ecac3ae3b
5 changed files with 157 additions and 5 deletions

73
math.js
View File

@ -5746,7 +5746,78 @@ squeeze.doc = {
'size(squeeze(b))'
],
'seealso': [
'det', 'diag', 'eye', 'ones', 'range', 'transpose', 'zeros'
'det', 'diag', 'eye', 'ones', 'range', 'size', 'transpose', 'zeros'
]
};
/**
* @constructor transpose
* Calculate the determinant of a matrix, transpose(x)
* @param {Array | Matrix} x
* @return {Array | Matrix} transpose
*/
function transpose (x) {
if (arguments.length != 1) {
throw newArgumentsError('transpose', arguments.length, 1);
}
var size = math.size(x);
switch (size.length) {
case 0:
// scalar
return math.clone(x);
break;
case 1:
// vector
// TODO: is it logic to return a 1 dimensional vector itself as transpose?
return math.clone(x);
break;
case 2:
// two dimensional array
var rows = size[1], // index 1 is no error
cols = size[0], // index 0 is no error
array = x.valueOf(),
transposed = [],
transposedRow,
clone = math.clone;
for (var r = 0; r < rows; r++) {
transposedRow = transposed[r] = [];
for (var c = 0; c < cols; c++) {
transposedRow[c] = clone(array[c][r]);
}
}
if (cols == 0) {
transposed[0] = [];
}
return transposed;
break;
default:
// multi dimensional array
throw new RangeError('Matrix must be two dimensional ' +
'(size: ' + math.format(size) + ')');
}
}
math.transpose = transpose;
/**
* Function documentation
*/
transpose.doc = {
'name': this.name,
'category': 'Numerics',
'syntax': [
'transpose(x)'
],
'description': 'Transpose a matrix',
'examples': [
'a = [1, 2, 3; 4, 5, 6]',
'transpose(a)'
],
'seealso': [
'det', 'diag', 'eye', 'ones', 'range', 'size', 'squeeze', 'transpose', 'zeros'
]
};
/**

6
math.min.js vendored

File diff suppressed because one or more lines are too long

View File

@ -62,6 +62,6 @@ squeeze.doc = {
'size(squeeze(b))'
],
'seealso': [
'det', 'diag', 'eye', 'ones', 'range', 'transpose', 'zeros'
'det', 'diag', 'eye', 'ones', 'range', 'size', 'transpose', 'zeros'
]
};

View File

@ -0,0 +1,71 @@
/**
* @constructor transpose
* Calculate the determinant of a matrix, transpose(x)
* @param {Array | Matrix} x
* @return {Array | Matrix} transpose
*/
function transpose (x) {
if (arguments.length != 1) {
throw newArgumentsError('transpose', arguments.length, 1);
}
var size = math.size(x);
switch (size.length) {
case 0:
// scalar
return math.clone(x);
break;
case 1:
// vector
// TODO: is it logic to return a 1 dimensional vector itself as transpose?
return math.clone(x);
break;
case 2:
// two dimensional array
var rows = size[1], // index 1 is no error
cols = size[0], // index 0 is no error
array = x.valueOf(),
transposed = [],
transposedRow,
clone = math.clone;
for (var r = 0; r < rows; r++) {
transposedRow = transposed[r] = [];
for (var c = 0; c < cols; c++) {
transposedRow[c] = clone(array[c][r]);
}
}
if (cols == 0) {
transposed[0] = [];
}
return transposed;
break;
default:
// multi dimensional array
throw new RangeError('Matrix must be two dimensional ' +
'(size: ' + math.format(size) + ')');
}
}
math.transpose = transpose;
/**
* Function documentation
*/
transpose.doc = {
'name': this.name,
'category': 'Numerics',
'syntax': [
'transpose(x)'
],
'description': 'Transpose a matrix',
'examples': [
'a = [1, 2, 3; 4, 5, 6]',
'transpose(a)'
],
'seealso': [
'det', 'diag', 'eye', 'ones', 'range', 'size', 'squeeze', 'transpose', 'zeros'
]
};

View File

@ -30,6 +30,7 @@ assert.deepEqual(math.diag([[1,2,3],[4,5,6]],1).valueOf(), [2,6]);
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]]);
assert.throws(function () {math.diag([[[1],[2]],[[3],[4]]])});
// TODO: test diag for all types of input (also scalar)
// test eye
@ -91,6 +92,15 @@ 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]);
// test transpose
assert.deepEqual(math.transpose(3), 3);
assert.deepEqual(math.transpose([1,2,3]), [1,2,3]);
assert.deepEqual(math.transpose([[1,2,3],[4,5,6]]), [[1,4],[2,5],[3,6]]);
assert.deepEqual(math.transpose([[1,2],[3,4]]), [[1,3],[2,4]]);
assert.deepEqual(math.transpose([[1,2,3,4]]), [[1],[2],[3],[4]]);
assert.deepEqual(math.transpose([[]]), [[]]);
assert.throws(function () {math.transpose([[[1],[2]],[[3],[4]]])});
// test zeros
assert.deepEqual(math.zeros().valueOf(), [[0]]);
assert.deepEqual(math.zeros([]).valueOf(), [[0]]);