transpose.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.createTranspose = void 0;
  6. var _object = require("../../utils/object.js");
  7. var _string = require("../../utils/string.js");
  8. var _factory = require("../../utils/factory.js");
  9. var name = 'transpose';
  10. var dependencies = ['typed', 'matrix'];
  11. var createTranspose = /* #__PURE__ */(0, _factory.factory)(name, dependencies, function (_ref) {
  12. var typed = _ref.typed,
  13. matrix = _ref.matrix;
  14. /**
  15. * Transpose a matrix. All values of the matrix are reflected over its
  16. * main diagonal. Only applicable to two dimensional matrices containing
  17. * a vector (i.e. having size `[1,n]` or `[n,1]`). One dimensional
  18. * vectors and scalars return the input unchanged.
  19. *
  20. * Syntax:
  21. *
  22. * math.transpose(x)
  23. *
  24. * Examples:
  25. *
  26. * const A = [[1, 2, 3], [4, 5, 6]]
  27. * math.transpose(A) // returns [[1, 4], [2, 5], [3, 6]]
  28. *
  29. * See also:
  30. *
  31. * diag, inv, subset, squeeze
  32. *
  33. * @param {Array | Matrix} x Matrix to be transposed
  34. * @return {Array | Matrix} The transposed matrix
  35. */
  36. return typed(name, {
  37. Array: function Array(x) {
  38. return transposeMatrix(matrix(x)).valueOf();
  39. },
  40. Matrix: transposeMatrix,
  41. any: _object.clone // scalars
  42. });
  43. function transposeMatrix(x) {
  44. // matrix size
  45. var size = x.size();
  46. // result
  47. var c;
  48. // process dimensions
  49. switch (size.length) {
  50. case 1:
  51. // vector
  52. c = x.clone();
  53. break;
  54. case 2:
  55. {
  56. // rows and columns
  57. var rows = size[0];
  58. var columns = size[1];
  59. // check columns
  60. if (columns === 0) {
  61. // throw exception
  62. throw new RangeError('Cannot transpose a 2D matrix with no columns (size: ' + (0, _string.format)(size) + ')');
  63. }
  64. // process storage format
  65. switch (x.storage()) {
  66. case 'dense':
  67. c = _denseTranspose(x, rows, columns);
  68. break;
  69. case 'sparse':
  70. c = _sparseTranspose(x, rows, columns);
  71. break;
  72. }
  73. }
  74. break;
  75. default:
  76. // multi dimensional
  77. throw new RangeError('Matrix must be a vector or two dimensional (size: ' + (0, _string.format)(size) + ')');
  78. }
  79. return c;
  80. }
  81. function _denseTranspose(m, rows, columns) {
  82. // matrix array
  83. var data = m._data;
  84. // transposed matrix data
  85. var transposed = [];
  86. var transposedRow;
  87. // loop columns
  88. for (var j = 0; j < columns; j++) {
  89. // initialize row
  90. transposedRow = transposed[j] = [];
  91. // loop rows
  92. for (var i = 0; i < rows; i++) {
  93. // set data
  94. transposedRow[i] = (0, _object.clone)(data[i][j]);
  95. }
  96. }
  97. // return matrix
  98. return m.createDenseMatrix({
  99. data: transposed,
  100. size: [columns, rows],
  101. datatype: m._datatype
  102. });
  103. }
  104. function _sparseTranspose(m, rows, columns) {
  105. // matrix arrays
  106. var values = m._values;
  107. var index = m._index;
  108. var ptr = m._ptr;
  109. // result matrices
  110. var cvalues = values ? [] : undefined;
  111. var cindex = [];
  112. var cptr = [];
  113. // row counts
  114. var w = [];
  115. for (var x = 0; x < rows; x++) {
  116. w[x] = 0;
  117. }
  118. // vars
  119. var p, l, j;
  120. // loop values in matrix
  121. for (p = 0, l = index.length; p < l; p++) {
  122. // number of values in row
  123. w[index[p]]++;
  124. }
  125. // cumulative sum
  126. var sum = 0;
  127. // initialize cptr with the cummulative sum of row counts
  128. for (var i = 0; i < rows; i++) {
  129. // update cptr
  130. cptr.push(sum);
  131. // update sum
  132. sum += w[i];
  133. // update w
  134. w[i] = cptr[i];
  135. }
  136. // update cptr
  137. cptr.push(sum);
  138. // loop columns
  139. for (j = 0; j < columns; j++) {
  140. // values & index in column
  141. for (var k0 = ptr[j], k1 = ptr[j + 1], k = k0; k < k1; k++) {
  142. // C values & index
  143. var q = w[index[k]]++;
  144. // C[j, i] = A[i, j]
  145. cindex[q] = j;
  146. // check we need to process values (pattern matrix)
  147. if (values) {
  148. cvalues[q] = (0, _object.clone)(values[k]);
  149. }
  150. }
  151. }
  152. // return matrix
  153. return m.createSparseMatrix({
  154. values: cvalues,
  155. index: cindex,
  156. ptr: cptr,
  157. size: [columns, rows],
  158. datatype: m._datatype
  159. });
  160. }
  161. });
  162. exports.createTranspose = createTranspose;