simple-squiggle/node_modules/mathjs/lib/cjs/function/matrix/transpose.js

184 lines
4.4 KiB
JavaScript

"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.createTranspose = void 0;
var _object = require("../../utils/object.js");
var _string = require("../../utils/string.js");
var _factory = require("../../utils/factory.js");
var name = 'transpose';
var dependencies = ['typed', 'matrix'];
var createTranspose = /* #__PURE__ */(0, _factory.factory)(name, dependencies, function (_ref) {
var typed = _ref.typed,
matrix = _ref.matrix;
/**
* Transpose a matrix. All values of the matrix are reflected over its
* main diagonal. Only applicable to two dimensional matrices containing
* a vector (i.e. having size `[1,n]` or `[n,1]`). One dimensional
* vectors and scalars return the input unchanged.
*
* Syntax:
*
* math.transpose(x)
*
* Examples:
*
* const A = [[1, 2, 3], [4, 5, 6]]
* math.transpose(A) // returns [[1, 4], [2, 5], [3, 6]]
*
* See also:
*
* diag, inv, subset, squeeze
*
* @param {Array | Matrix} x Matrix to be transposed
* @return {Array | Matrix} The transposed matrix
*/
return typed('transpose', {
Array: function Array(x) {
// use dense matrix implementation
return this(matrix(x)).valueOf();
},
Matrix: function Matrix(x) {
// matrix size
var size = x.size(); // result
var c; // process dimensions
switch (size.length) {
case 1:
// vector
c = x.clone();
break;
case 2:
{
// rows and columns
var rows = size[0];
var columns = size[1]; // check columns
if (columns === 0) {
// throw exception
throw new RangeError('Cannot transpose a 2D matrix with no columns (size: ' + (0, _string.format)(size) + ')');
} // process storage format
switch (x.storage()) {
case 'dense':
c = _denseTranspose(x, rows, columns);
break;
case 'sparse':
c = _sparseTranspose(x, rows, columns);
break;
}
}
break;
default:
// multi dimensional
throw new RangeError('Matrix must be a vector or two dimensional (size: ' + (0, _string.format)(this._size) + ')');
}
return c;
},
// scalars
any: function any(x) {
return (0, _object.clone)(x);
}
});
function _denseTranspose(m, rows, columns) {
// matrix array
var data = m._data; // transposed matrix data
var transposed = [];
var transposedRow; // loop columns
for (var j = 0; j < columns; j++) {
// initialize row
transposedRow = transposed[j] = []; // loop rows
for (var i = 0; i < rows; i++) {
// set data
transposedRow[i] = (0, _object.clone)(data[i][j]);
}
} // return matrix
return m.createDenseMatrix({
data: transposed,
size: [columns, rows],
datatype: m._datatype
});
}
function _sparseTranspose(m, rows, columns) {
// matrix arrays
var values = m._values;
var index = m._index;
var ptr = m._ptr; // result matrices
var cvalues = values ? [] : undefined;
var cindex = [];
var cptr = []; // row counts
var w = [];
for (var x = 0; x < rows; x++) {
w[x] = 0;
} // vars
var p, l, j; // loop values in matrix
for (p = 0, l = index.length; p < l; p++) {
// number of values in row
w[index[p]]++;
} // cumulative sum
var sum = 0; // initialize cptr with the cummulative sum of row counts
for (var i = 0; i < rows; i++) {
// update cptr
cptr.push(sum); // update sum
sum += w[i]; // update w
w[i] = cptr[i];
} // update cptr
cptr.push(sum); // loop columns
for (j = 0; j < columns; j++) {
// values & index in column
for (var k0 = ptr[j], k1 = ptr[j + 1], k = k0; k < k1; k++) {
// C values & index
var q = w[index[k]]++; // C[j, i] = A[i, j]
cindex[q] = j; // check we need to process values (pattern matrix)
if (values) {
cvalues[q] = (0, _object.clone)(values[k]);
}
}
} // return matrix
return m.createSparseMatrix({
values: cvalues,
index: cindex,
ptr: cptr,
size: [columns, rows],
datatype: m._datatype
});
}
});
exports.createTranspose = createTranspose;