1 | import { isMatrix } from '../../utils/is';
|
2 | import { arraySize } from '../../utils/array';
|
3 | import { isInteger } from '../../utils/number';
|
4 | import { factory } from '../../utils/factory';
|
5 | var name = 'diag';
|
6 | var dependencies = ['typed', 'matrix', 'DenseMatrix', 'SparseMatrix'];
|
7 | export var createDiag = factory(name, dependencies, function (_ref) {
|
8 | var typed = _ref.typed,
|
9 | matrix = _ref.matrix,
|
10 | DenseMatrix = _ref.DenseMatrix,
|
11 | SparseMatrix = _ref.SparseMatrix;
|
12 |
|
13 | |
14 |
|
15 |
|
16 |
|
17 |
|
18 |
|
19 |
|
20 |
|
21 |
|
22 |
|
23 |
|
24 |
|
25 |
|
26 |
|
27 |
|
28 |
|
29 |
|
30 |
|
31 |
|
32 |
|
33 |
|
34 |
|
35 |
|
36 |
|
37 |
|
38 |
|
39 |
|
40 |
|
41 |
|
42 |
|
43 |
|
44 |
|
45 |
|
46 |
|
47 |
|
48 |
|
49 |
|
50 | return typed(name, {
|
51 |
|
52 | Array: function Array(x) {
|
53 | return _diag(x, 0, arraySize(x), null);
|
54 | },
|
55 | 'Array, number': function ArrayNumber(x, k) {
|
56 | return _diag(x, k, arraySize(x), null);
|
57 | },
|
58 | 'Array, BigNumber': function ArrayBigNumber(x, k) {
|
59 | return _diag(x, k.toNumber(), arraySize(x), null);
|
60 | },
|
61 | 'Array, string': function ArrayString(x, format) {
|
62 | return _diag(x, 0, arraySize(x), format);
|
63 | },
|
64 | 'Array, number, string': function ArrayNumberString(x, k, format) {
|
65 | return _diag(x, k, arraySize(x), format);
|
66 | },
|
67 | 'Array, BigNumber, string': function ArrayBigNumberString(x, k, format) {
|
68 | return _diag(x, k.toNumber(), arraySize(x), format);
|
69 | },
|
70 | Matrix: function Matrix(x) {
|
71 | return _diag(x, 0, x.size(), x.storage());
|
72 | },
|
73 | 'Matrix, number': function MatrixNumber(x, k) {
|
74 | return _diag(x, k, x.size(), x.storage());
|
75 | },
|
76 | 'Matrix, BigNumber': function MatrixBigNumber(x, k) {
|
77 | return _diag(x, k.toNumber(), x.size(), x.storage());
|
78 | },
|
79 | 'Matrix, string': function MatrixString(x, format) {
|
80 | return _diag(x, 0, x.size(), format);
|
81 | },
|
82 | 'Matrix, number, string': function MatrixNumberString(x, k, format) {
|
83 | return _diag(x, k, x.size(), format);
|
84 | },
|
85 | 'Matrix, BigNumber, string': function MatrixBigNumberString(x, k, format) {
|
86 | return _diag(x, k.toNumber(), x.size(), format);
|
87 | }
|
88 | });
|
89 | |
90 |
|
91 |
|
92 |
|
93 |
|
94 |
|
95 |
|
96 |
|
97 |
|
98 |
|
99 | function _diag(x, k, size, format) {
|
100 | if (!isInteger(k)) {
|
101 | throw new TypeError('Second parameter in function diag must be an integer');
|
102 | }
|
103 |
|
104 | var kSuper = k > 0 ? k : 0;
|
105 | var kSub = k < 0 ? -k : 0;
|
106 |
|
107 | switch (size.length) {
|
108 | case 1:
|
109 | return _createDiagonalMatrix(x, k, format, size[0], kSub, kSuper);
|
110 |
|
111 | case 2:
|
112 | return _getDiagonal(x, k, format, size, kSub, kSuper);
|
113 | }
|
114 |
|
115 | throw new RangeError('Matrix for function diag must be 2 dimensional');
|
116 | }
|
117 |
|
118 | function _createDiagonalMatrix(x, k, format, l, kSub, kSuper) {
|
119 |
|
120 | var ms = [l + kSub, l + kSuper];
|
121 |
|
122 | if (format && format !== 'sparse' && format !== 'dense') {
|
123 | throw new TypeError("Unknown matrix type ".concat(format, "\""));
|
124 | }
|
125 |
|
126 |
|
127 | var m = format === 'sparse' ? SparseMatrix.diagonal(ms, x, k) : DenseMatrix.diagonal(ms, x, k);
|
128 |
|
129 | return format !== null ? m : m.valueOf();
|
130 | }
|
131 |
|
132 | function _getDiagonal(x, k, format, s, kSub, kSuper) {
|
133 |
|
134 | if (isMatrix(x)) {
|
135 |
|
136 | var dm = x.diagonal(k);
|
137 |
|
138 | if (format !== null) {
|
139 |
|
140 | if (format !== dm.storage()) {
|
141 | return matrix(dm, format);
|
142 | }
|
143 |
|
144 | return dm;
|
145 | }
|
146 |
|
147 | return dm.valueOf();
|
148 | }
|
149 |
|
150 |
|
151 | var n = Math.min(s[0] - kSub, s[1] - kSuper);
|
152 |
|
153 | var vector = [];
|
154 |
|
155 | for (var i = 0; i < n; i++) {
|
156 | vector[i] = x[i + kSub][i + kSuper];
|
157 | }
|
158 |
|
159 |
|
160 | return format !== null ? matrix(vector) : vector;
|
161 | }
|
162 | }); |
\ | No newline at end of file |