2015-02-09 21:43:00 +01:00

103 lines
2.2 KiB
JavaScript

'use strict';
module.exports = function (math) {
var util = require('../../util/index'),
Matrix = require('../../type/Matrix'),
object = util.object,
string = util.string;
/**
* Calculate the trace of a matrix: the sum of the elements on the main
* diagonal of a square matrix.
*
* Syntax:
*
* math.trace(x)
*
* Examples:
*
* math.trace([[1, 2], [3, 4]]); // returns 5
*
* var A = [
* [1, 2, 3],
* [-1, 2, 3],
* [2, 0, 3]
* ]
* math.trace(A); // returns 6
*
* See also:
*
* diag
*
* @param {Array | Matrix} x A matrix
* @return {Number} The trace of `x`
*/
math.trace = function trace (x) {
if (arguments.length != 1) {
throw new math.error.ArgumentsError('trace', arguments.length, 1);
}
var size;
if (x instanceof Matrix) {
size = x.size();
}
else if (x instanceof Array) {
x = new Matrix(x);
size = x.size();
}
else {
// a scalar
size = [];
}
switch (size.length) {
case 0:
// scalar
return object.clone(x);
case 1:
// vector
if (size[0] == 1) {
return object.clone(x.valueOf()[0]);
}
else {
throw new RangeError('Matrix must be square ' +
'(size: ' + string.format(size) + ')');
}
case 2:
// two dimensional array
var rows = size[0];
var cols = size[1];
if (rows == cols) {
return _trace(x.clone().valueOf());
}
else {
throw new RangeError('Matrix must be square ' +
'(size: ' + string.format(size) + ')');
}
default:
// multi dimensional array
throw new RangeError('Matrix must be two dimensional ' +
'(size: ' + string.format(size) + ')');
}
};
/**
* Calculate the trace of a matrix
* @param {Array[]} matrix A square, two dimensional matrix
* @returns {Number} trace
* @private
*/
function _trace (matrix) {
var sum = 0;
for (var i = 0; i < matrix.length; i++) {
sum = math.add(sum, matrix[i][i]);
}
return sum;
}
};