1 | import { containsCollections } from '../../utils/collection.js';
|
2 | import { flatten } from '../../utils/array.js';
|
3 | import { factory } from '../../utils/factory.js';
|
4 | import { improveErrorMessage } from './utils/improveErrorMessage.js';
|
5 | var name = 'median';
|
6 | var dependencies = ['typed', 'add', 'divide', 'compare', 'partitionSelect'];
|
7 | export var createMedian = factory(name, dependencies, _ref => {
|
8 | var {
|
9 | typed,
|
10 | add,
|
11 | divide,
|
12 | compare,
|
13 | partitionSelect
|
14 | } = _ref;
|
15 |
|
16 | |
17 |
|
18 |
|
19 |
|
20 |
|
21 |
|
22 | function _median(array) {
|
23 | try {
|
24 | array = flatten(array.valueOf());
|
25 | var num = array.length;
|
26 |
|
27 | if (num === 0) {
|
28 | throw new Error('Cannot calculate median of an empty array');
|
29 | }
|
30 |
|
31 | if (num % 2 === 0) {
|
32 |
|
33 | var mid = num / 2 - 1;
|
34 | var right = partitionSelect(array, mid + 1);
|
35 |
|
36 | var left = array[mid];
|
37 |
|
38 | for (var i = 0; i < mid; ++i) {
|
39 | if (compare(array[i], left) > 0) {
|
40 | left = array[i];
|
41 | }
|
42 | }
|
43 |
|
44 | return middle2(left, right);
|
45 | } else {
|
46 |
|
47 | var m = partitionSelect(array, (num - 1) / 2);
|
48 | return middle(m);
|
49 | }
|
50 | } catch (err) {
|
51 | throw improveErrorMessage(err, 'median');
|
52 | }
|
53 | }
|
54 |
|
55 |
|
56 | var middle = typed({
|
57 | 'number | BigNumber | Complex | Unit': function numberBigNumberComplexUnit(value) {
|
58 | return value;
|
59 | }
|
60 | });
|
61 |
|
62 | var middle2 = typed({
|
63 | 'number | BigNumber | Complex | Unit, number | BigNumber | Complex | Unit': function numberBigNumberComplexUnitNumberBigNumberComplexUnit(left, right) {
|
64 | return divide(add(left, right), 2);
|
65 | }
|
66 | });
|
67 | |
68 |
|
69 |
|
70 |
|
71 |
|
72 |
|
73 |
|
74 |
|
75 |
|
76 |
|
77 |
|
78 |
|
79 |
|
80 |
|
81 |
|
82 |
|
83 |
|
84 |
|
85 |
|
86 |
|
87 |
|
88 |
|
89 |
|
90 |
|
91 |
|
92 |
|
93 |
|
94 | return typed(name, {
|
95 |
|
96 | 'Array | Matrix': _median,
|
97 |
|
98 | 'Array | Matrix, number | BigNumber': function ArrayMatrixNumberBigNumber(array, dim) {
|
99 |
|
100 | throw new Error('median(A, dim) is not yet supported');
|
101 | },
|
102 |
|
103 | '...': function _(args) {
|
104 | if (containsCollections(args)) {
|
105 | throw new TypeError('Scalar values expected in function median');
|
106 | }
|
107 |
|
108 | return _median(args);
|
109 | }
|
110 | });
|
111 | }); |
\ | No newline at end of file |