UNPKG

5.74 kBJavaScriptView Raw
1"use strict";
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.createDiag = void 0;
7
8var _is = require("../../utils/is.js");
9
10var _array = require("../../utils/array.js");
11
12var _number = require("../../utils/number.js");
13
14var _factory = require("../../utils/factory.js");
15
16var name = 'diag';
17var dependencies = ['typed', 'matrix', 'DenseMatrix', 'SparseMatrix'];
18var createDiag = /* #__PURE__ */(0, _factory.factory)(name, dependencies, function (_ref) {
19 var typed = _ref.typed,
20 matrix = _ref.matrix,
21 DenseMatrix = _ref.DenseMatrix,
22 SparseMatrix = _ref.SparseMatrix;
23
24 /**
25 * Create a diagonal matrix or retrieve the diagonal of a matrix
26 *
27 * When `x` is a vector, a matrix with vector `x` on the diagonal will be returned.
28 * When `x` is a two dimensional matrix, the matrixes `k`th diagonal will be returned as vector.
29 * When k is positive, the values are placed on the super diagonal.
30 * When k is negative, the values are placed on the sub diagonal.
31 *
32 * Syntax:
33 *
34 * math.diag(X)
35 * math.diag(X, format)
36 * math.diag(X, k)
37 * math.diag(X, k, format)
38 *
39 * Examples:
40 *
41 * // create a diagonal matrix
42 * math.diag([1, 2, 3]) // returns [[1, 0, 0], [0, 2, 0], [0, 0, 3]]
43 * math.diag([1, 2, 3], 1) // returns [[0, 1, 0, 0], [0, 0, 2, 0], [0, 0, 0, 3]]
44 * math.diag([1, 2, 3], -1) // returns [[0, 0, 0], [1, 0, 0], [0, 2, 0], [0, 0, 3]]
45 *
46 * // retrieve the diagonal from a matrix
47 * const a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
48 * math.diag(a) // returns [1, 5, 9]
49 *
50 * See also:
51 *
52 * ones, zeros, identity
53 *
54 * @param {Matrix | Array} x A two dimensional matrix or a vector
55 * @param {number | BigNumber} [k=0] The diagonal where the vector will be filled
56 * in or retrieved.
57 * @param {string} [format='dense'] The matrix storage format.
58 *
59 * @returns {Matrix | Array} Diagonal matrix from input vector, or diagonal from input matrix.
60 */
61 return typed(name, {
62 // FIXME: simplify this huge amount of signatures as soon as typed-function supports optional arguments
63 Array: function Array(x) {
64 return _diag(x, 0, (0, _array.arraySize)(x), null);
65 },
66 'Array, number': function ArrayNumber(x, k) {
67 return _diag(x, k, (0, _array.arraySize)(x), null);
68 },
69 'Array, BigNumber': function ArrayBigNumber(x, k) {
70 return _diag(x, k.toNumber(), (0, _array.arraySize)(x), null);
71 },
72 'Array, string': function ArrayString(x, format) {
73 return _diag(x, 0, (0, _array.arraySize)(x), format);
74 },
75 'Array, number, string': function ArrayNumberString(x, k, format) {
76 return _diag(x, k, (0, _array.arraySize)(x), format);
77 },
78 'Array, BigNumber, string': function ArrayBigNumberString(x, k, format) {
79 return _diag(x, k.toNumber(), (0, _array.arraySize)(x), format);
80 },
81 Matrix: function Matrix(x) {
82 return _diag(x, 0, x.size(), x.storage());
83 },
84 'Matrix, number': function MatrixNumber(x, k) {
85 return _diag(x, k, x.size(), x.storage());
86 },
87 'Matrix, BigNumber': function MatrixBigNumber(x, k) {
88 return _diag(x, k.toNumber(), x.size(), x.storage());
89 },
90 'Matrix, string': function MatrixString(x, format) {
91 return _diag(x, 0, x.size(), format);
92 },
93 'Matrix, number, string': function MatrixNumberString(x, k, format) {
94 return _diag(x, k, x.size(), format);
95 },
96 'Matrix, BigNumber, string': function MatrixBigNumberString(x, k, format) {
97 return _diag(x, k.toNumber(), x.size(), format);
98 }
99 });
100 /**
101 * Creeate diagonal matrix from a vector or vice versa
102 * @param {Array | Matrix} x
103 * @param {number} k
104 * @param {string} format Storage format for matrix. If null,
105 * an Array is returned
106 * @returns {Array | Matrix}
107 * @private
108 */
109
110 function _diag(x, k, size, format) {
111 if (!(0, _number.isInteger)(k)) {
112 throw new TypeError('Second parameter in function diag must be an integer');
113 }
114
115 var kSuper = k > 0 ? k : 0;
116 var kSub = k < 0 ? -k : 0; // check dimensions
117
118 switch (size.length) {
119 case 1:
120 return _createDiagonalMatrix(x, k, format, size[0], kSub, kSuper);
121
122 case 2:
123 return _getDiagonal(x, k, format, size, kSub, kSuper);
124 }
125
126 throw new RangeError('Matrix for function diag must be 2 dimensional');
127 }
128
129 function _createDiagonalMatrix(x, k, format, l, kSub, kSuper) {
130 // matrix size
131 var ms = [l + kSub, l + kSuper];
132
133 if (format && format !== 'sparse' && format !== 'dense') {
134 throw new TypeError("Unknown matrix type ".concat(format, "\""));
135 } // create diagonal matrix
136
137
138 var m = format === 'sparse' ? SparseMatrix.diagonal(ms, x, k) : DenseMatrix.diagonal(ms, x, k); // check we need to return a matrix
139
140 return format !== null ? m : m.valueOf();
141 }
142
143 function _getDiagonal(x, k, format, s, kSub, kSuper) {
144 // check x is a Matrix
145 if ((0, _is.isMatrix)(x)) {
146 // get diagonal matrix
147 var dm = x.diagonal(k); // check we need to return a matrix
148
149 if (format !== null) {
150 // check we need to change matrix format
151 if (format !== dm.storage()) {
152 return matrix(dm, format);
153 }
154
155 return dm;
156 }
157
158 return dm.valueOf();
159 } // vector size
160
161
162 var n = Math.min(s[0] - kSub, s[1] - kSuper); // diagonal values
163
164 var vector = []; // loop diagonal
165
166 for (var i = 0; i < n; i++) {
167 vector[i] = x[i + kSub][i + kSuper];
168 } // check we need to return a matrix
169
170
171 return format !== null ? matrix(vector) : vector;
172 }
173});
174exports.createDiag = createDiag;
\No newline at end of file