mirror of
https://github.com/josdejong/mathjs.git
synced 2026-01-18 14:59:29 +00:00
Implemented transpose
This commit is contained in:
parent
78bf9dbf4a
commit
2ecac3ae3b
73
math.js
73
math.js
@ -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
6
math.min.js
vendored
File diff suppressed because one or more lines are too long
@ -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'
|
||||
]
|
||||
};
|
||||
71
src/function/matrix/transpose.js
Normal file
71
src/function/matrix/transpose.js
Normal 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'
|
||||
]
|
||||
};
|
||||
@ -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]]);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user