mathjs 7.3.0 → 7.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/HISTORY.md +29 -0
- package/dist/math.js +2716 -2222
- package/dist/math.min.js +5 -5
- package/dist/math.min.map +1 -1
- package/docs/datatypes/units.md +21 -0
- package/docs/reference/functions/ceil.md +10 -1
- package/docs/reference/functions/fix.md +10 -2
- package/docs/reference/functions/floor.md +12 -3
- package/docs/reference/functions/rotate.md +47 -0
- package/docs/reference/functions/rotationMatrix.md +51 -0
- package/docs/reference/functions/round.md +6 -2
- package/docs/reference/functions.md +2 -0
- package/es/entry/dependenciesAny/dependenciesCeil.generated.js +4 -0
- package/es/entry/dependenciesAny/dependenciesFix.generated.js +2 -0
- package/es/entry/dependenciesAny/dependenciesFloor.generated.js +4 -0
- package/es/entry/dependenciesAny/dependenciesRotate.generated.js +14 -0
- package/es/entry/dependenciesAny/dependenciesRotationMatrix.generated.js +30 -0
- package/es/entry/dependenciesAny.generated.js +2 -0
- package/es/entry/impureFunctionsAny.generated.js +55 -53
- package/es/entry/pureFunctionsAny.generated.js +230 -206
- package/es/expression/embeddedDocs/embeddedDocs.js +4 -0
- package/es/expression/embeddedDocs/function/matrix/rotate.js +8 -0
- package/es/expression/embeddedDocs/function/matrix/rotationMatrix.js +8 -0
- package/es/expression/node/FunctionNode.js +1 -1
- package/es/expression/node/Node.js +2 -2
- package/es/factoriesAny.js +2 -0
- package/es/function/arithmetic/ceil.js +88 -4
- package/es/function/arithmetic/fix.js +43 -6
- package/es/function/arithmetic/floor.js +90 -6
- package/es/function/arithmetic/round.js +6 -2
- package/es/function/matrix/rotate.js +78 -0
- package/es/function/matrix/rotationMatrix.js +176 -0
- package/es/function/matrix/sqrtm.js +4 -0
- package/es/function/probability/pickRandom.js +2 -6
- package/es/function/special/erf.js +1 -0
- package/es/plain/number/constants.js +1 -1
- package/es/plain/number/probability.js +1 -0
- package/es/type/unit/Unit.js +17 -18
- package/es/utils/object.js +3 -1
- package/es/version.js +1 -1
- package/examples/bignumbers.js +2 -0
- package/lib/entry/dependenciesAny/dependenciesCeil.generated.js +6 -0
- package/lib/entry/dependenciesAny/dependenciesFix.generated.js +3 -0
- package/lib/entry/dependenciesAny/dependenciesFloor.generated.js +6 -0
- package/lib/entry/dependenciesAny/dependenciesRotate.generated.js +26 -0
- package/lib/entry/dependenciesAny/dependenciesRotationMatrix.generated.js +50 -0
- package/lib/entry/dependenciesAny.generated.js +16 -0
- package/lib/entry/impureFunctionsAny.generated.js +58 -56
- package/lib/entry/mainAny.js +5 -0
- package/lib/entry/mainNumber.js +5 -0
- package/lib/entry/pureFunctionsAny.generated.js +270 -244
- package/lib/expression/embeddedDocs/embeddedDocs.js +6 -0
- package/lib/expression/embeddedDocs/function/matrix/rotate.js +15 -0
- package/lib/expression/embeddedDocs/function/matrix/rotationMatrix.js +15 -0
- package/lib/expression/node/FunctionNode.js +1 -1
- package/lib/expression/node/Node.js +2 -2
- package/lib/factoriesAny.js +16 -0
- package/lib/function/arithmetic/ceil.js +91 -4
- package/lib/function/arithmetic/fix.js +44 -6
- package/lib/function/arithmetic/floor.js +93 -6
- package/lib/function/arithmetic/round.js +6 -2
- package/lib/function/matrix/rotate.js +88 -0
- package/lib/function/matrix/rotationMatrix.js +186 -0
- package/lib/function/matrix/sqrtm.js +4 -0
- package/lib/function/probability/pickRandom.js +3 -7
- package/lib/function/special/erf.js +1 -0
- package/lib/header.js +2 -2
- package/lib/plain/bignumber/index.js +1 -0
- package/lib/plain/number/constants.js +2 -1
- package/lib/plain/number/index.js +9 -0
- package/lib/plain/number/probability.js +1 -0
- package/lib/type/unit/Unit.js +17 -18
- package/lib/utils/object.js +3 -1
- package/lib/version.js +1 -1
- package/package.json +11 -11
- package/src/core/function/import.js +2 -2
- package/src/entry/dependenciesAny/dependenciesCeil.generated.js +4 -0
- package/src/entry/dependenciesAny/dependenciesFix.generated.js +2 -0
- package/src/entry/dependenciesAny/dependenciesFloor.generated.js +4 -0
- package/src/entry/dependenciesAny/dependenciesRotate.generated.js +15 -0
- package/src/entry/dependenciesAny/dependenciesRotationMatrix.generated.js +31 -0
- package/src/entry/dependenciesAny.generated.js +2 -0
- package/src/entry/impureFunctionsAny.generated.js +84 -80
- package/src/entry/pureFunctionsAny.generated.js +75 -71
- package/src/expression/embeddedDocs/embeddedDocs.js +4 -0
- package/src/expression/embeddedDocs/function/matrix/rotate.js +19 -0
- package/src/expression/embeddedDocs/function/matrix/rotationMatrix.js +19 -0
- package/src/expression/node/FunctionNode.js +1 -1
- package/src/expression/node/Node.js +2 -1
- package/src/factoriesAny.js +2 -0
- package/src/function/arithmetic/ceil.js +63 -3
- package/src/function/arithmetic/fix.js +45 -6
- package/src/function/arithmetic/floor.js +65 -5
- package/src/function/arithmetic/round.js +6 -2
- package/src/function/matrix/rotate.js +79 -0
- package/src/function/matrix/rotationMatrix.js +186 -0
- package/src/function/matrix/sqrtm.js +4 -0
- package/src/function/probability/pickRandom.js +2 -6
- package/src/function/special/erf.js +2 -0
- package/src/plain/number/constants.js +1 -1
- package/src/plain/number/probability.js +2 -0
- package/src/type/unit/Unit.js +18 -21
- package/src/utils/object.js +3 -1
- package/src/version.js +1 -1
|
@@ -1,13 +1,19 @@
|
|
|
1
|
+
import { Decimal } from 'decimal.js'
|
|
1
2
|
import { factory } from '../../utils/factory'
|
|
2
3
|
import { deepMap } from '../../utils/collection'
|
|
3
4
|
import { nearlyEqual } from '../../utils/number'
|
|
4
5
|
import { nearlyEqual as bigNearlyEqual } from '../../utils/bignumber/nearlyEqual'
|
|
5
6
|
import { ceilNumber } from '../../plain/number'
|
|
7
|
+
import { createAlgorithm11 } from '../../type/matrix/utils/algorithm11'
|
|
8
|
+
import { createAlgorithm14 } from '../../type/matrix/utils/algorithm14'
|
|
6
9
|
|
|
7
10
|
const name = 'ceil'
|
|
8
|
-
const dependencies = ['typed', 'config', 'round']
|
|
11
|
+
const dependencies = ['typed', 'config', 'round', 'matrix', 'equalScalar']
|
|
12
|
+
|
|
13
|
+
export const createCeil = /* #__PURE__ */ factory(name, dependencies, ({ typed, config, round, matrix, equalScalar }) => {
|
|
14
|
+
const algorithm11 = createAlgorithm11({ typed, equalScalar })
|
|
15
|
+
const algorithm14 = createAlgorithm14({ typed })
|
|
9
16
|
|
|
10
|
-
export const createCeil = /* #__PURE__ */ factory(name, dependencies, ({ typed, config, round }) => {
|
|
11
17
|
/**
|
|
12
18
|
* Round a value towards plus infinity
|
|
13
19
|
* If `x` is complex, both real and imaginary part are rounded towards plus infinity.
|
|
@@ -16,6 +22,7 @@ export const createCeil = /* #__PURE__ */ factory(name, dependencies, ({ typed,
|
|
|
16
22
|
* Syntax:
|
|
17
23
|
*
|
|
18
24
|
* math.ceil(x)
|
|
25
|
+
* math.ceil(x, n)
|
|
19
26
|
*
|
|
20
27
|
* Examples:
|
|
21
28
|
*
|
|
@@ -24,16 +31,24 @@ export const createCeil = /* #__PURE__ */ factory(name, dependencies, ({ typed,
|
|
|
24
31
|
* math.ceil(-4.2) // returns number -4
|
|
25
32
|
* math.ceil(-4.7) // returns number -4
|
|
26
33
|
*
|
|
27
|
-
*
|
|
34
|
+
* math.ceil(3.212, 2) // returns number 3.22
|
|
35
|
+
* math.ceil(3.288, 2) // returns number 3.29
|
|
36
|
+
* math.ceil(-4.212, 2) // returns number -4.21
|
|
37
|
+
* math.ceil(-4.782, 2) // returns number -4.78
|
|
38
|
+
*
|
|
39
|
+
* const c = math.complex(3.24, -2.71)
|
|
28
40
|
* math.ceil(c) // returns Complex 4 - 2i
|
|
41
|
+
* math.ceil(c, 1) // returns Complex 3.3 - 2.7i
|
|
29
42
|
*
|
|
30
43
|
* math.ceil([3.2, 3.8, -4.7]) // returns Array [4, 4, -4]
|
|
44
|
+
* math.ceil([3.21, 3.82, -4.71], 1) // returns Array [3.3, 3.9, -4.7]
|
|
31
45
|
*
|
|
32
46
|
* See also:
|
|
33
47
|
*
|
|
34
48
|
* floor, fix, round
|
|
35
49
|
*
|
|
36
50
|
* @param {number | BigNumber | Fraction | Complex | Array | Matrix} x Number to be rounded
|
|
51
|
+
* @param {number | BigNumber | Array} [n=0] Number of decimals
|
|
37
52
|
* @return {number | BigNumber | Fraction | Complex | Array | Matrix} Rounded value
|
|
38
53
|
*/
|
|
39
54
|
return typed('ceil', {
|
|
@@ -45,10 +60,25 @@ export const createCeil = /* #__PURE__ */ factory(name, dependencies, ({ typed,
|
|
|
45
60
|
}
|
|
46
61
|
},
|
|
47
62
|
|
|
63
|
+
'number, number': function (x, n) {
|
|
64
|
+
if (nearlyEqual(x, round(x, n), config.epsilon)) {
|
|
65
|
+
return round(x, n)
|
|
66
|
+
} else {
|
|
67
|
+
let [number, exponent] = `${x}e`.split('e')
|
|
68
|
+
const result = Math.ceil(Number(`${number}e${Number(exponent) + n}`));
|
|
69
|
+
[number, exponent] = `${result}e`.split('e')
|
|
70
|
+
return Number(`${number}e${Number(exponent) - n}`)
|
|
71
|
+
}
|
|
72
|
+
},
|
|
73
|
+
|
|
48
74
|
Complex: function (x) {
|
|
49
75
|
return x.ceil()
|
|
50
76
|
},
|
|
51
77
|
|
|
78
|
+
'Complex, number': function (x, n) {
|
|
79
|
+
return x.ceil(n)
|
|
80
|
+
},
|
|
81
|
+
|
|
52
82
|
BigNumber: function (x) {
|
|
53
83
|
if (bigNearlyEqual(x, round(x), config.epsilon)) {
|
|
54
84
|
return round(x)
|
|
@@ -57,13 +87,43 @@ export const createCeil = /* #__PURE__ */ factory(name, dependencies, ({ typed,
|
|
|
57
87
|
}
|
|
58
88
|
},
|
|
59
89
|
|
|
90
|
+
'BigNumber, BigNumber': function (x, n) {
|
|
91
|
+
if (bigNearlyEqual(x, round(x, n), config.epsilon)) {
|
|
92
|
+
return round(x, n)
|
|
93
|
+
} else {
|
|
94
|
+
return x.toDecimalPlaces(n.toNumber(), Decimal.ROUND_CEIL)
|
|
95
|
+
}
|
|
96
|
+
},
|
|
97
|
+
|
|
60
98
|
Fraction: function (x) {
|
|
61
99
|
return x.ceil()
|
|
62
100
|
},
|
|
63
101
|
|
|
102
|
+
'Fraction, number': function (x, n) {
|
|
103
|
+
return x.ceil(n)
|
|
104
|
+
},
|
|
105
|
+
|
|
64
106
|
'Array | Matrix': function (x) {
|
|
65
107
|
// deep map collection, skip zeros since ceil(0) = 0
|
|
66
108
|
return deepMap(x, this, true)
|
|
109
|
+
},
|
|
110
|
+
|
|
111
|
+
'Array | Matrix, number': function (x, n) {
|
|
112
|
+
// deep map collection, skip zeros since ceil(0) = 0
|
|
113
|
+
return deepMap(x, i => this(i, n), true)
|
|
114
|
+
},
|
|
115
|
+
|
|
116
|
+
'SparseMatrix, number | BigNumber': function (x, y) {
|
|
117
|
+
return algorithm11(x, y, this, false)
|
|
118
|
+
},
|
|
119
|
+
|
|
120
|
+
'DenseMatrix, number | BigNumber': function (x, y) {
|
|
121
|
+
return algorithm14(x, y, this, false)
|
|
122
|
+
},
|
|
123
|
+
|
|
124
|
+
'number | Complex | BigNumber, Array': function (x, y) {
|
|
125
|
+
// use matrix implementation
|
|
126
|
+
return algorithm14(matrix(y), x, this, true).valueOf()
|
|
67
127
|
}
|
|
68
128
|
})
|
|
69
129
|
})
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { factory } from '../../utils/factory'
|
|
2
2
|
import { deepMap } from '../../utils/collection'
|
|
3
|
+
import { createAlgorithm14 } from '../../type/matrix/utils/algorithm14'
|
|
3
4
|
|
|
4
5
|
const name = 'fix'
|
|
5
|
-
const dependencies = ['typed', 'Complex', 'ceil', 'floor']
|
|
6
|
+
const dependencies = ['typed', 'Complex', 'matrix', 'ceil', 'floor']
|
|
6
7
|
|
|
7
|
-
export const createFix = /* #__PURE__ */ factory(name, dependencies, ({ typed, Complex, ceil, floor }) => {
|
|
8
|
+
export const createFix = /* #__PURE__ */ factory(name, dependencies, ({ typed, Complex, matrix, ceil, floor }) => {
|
|
9
|
+
const algorithm14 = createAlgorithm14({ typed })
|
|
8
10
|
/**
|
|
9
11
|
* Round a value towards zero.
|
|
10
12
|
* For matrices, the function is evaluated element wise.
|
|
@@ -20,23 +22,35 @@ export const createFix = /* #__PURE__ */ factory(name, dependencies, ({ typed, C
|
|
|
20
22
|
* math.fix(-4.2) // returns number -4
|
|
21
23
|
* math.fix(-4.7) // returns number -4
|
|
22
24
|
*
|
|
23
|
-
*
|
|
25
|
+
* math.fix(3.12, 1) // returns number 3.1
|
|
26
|
+
* math.fix(3.18, 1) // returns number 3.1
|
|
27
|
+
* math.fix(-4.12, 1) // returns number -4.1
|
|
28
|
+
* math.fix(-4.17, 1) // returns number -4.1
|
|
29
|
+
*
|
|
30
|
+
* const c = math.complex(3.22, -2.78)
|
|
24
31
|
* math.fix(c) // returns Complex 3 - 2i
|
|
32
|
+
* math.fix(c, 1) // returns Complex 3.2 - 2.7i
|
|
25
33
|
*
|
|
26
|
-
* math.fix([3.2, 3.8, -4.7])
|
|
34
|
+
* math.fix([3.2, 3.8, -4.7]) // returns Array [3, 3, -4]
|
|
35
|
+
* math.fix([3.2, 3.8, -4.7], 1) // returns Array [3.2, 3.8, -4.7]
|
|
27
36
|
*
|
|
28
37
|
* See also:
|
|
29
38
|
*
|
|
30
39
|
* ceil, floor, round
|
|
31
40
|
*
|
|
32
|
-
* @param
|
|
33
|
-
* @
|
|
41
|
+
* @param {number | BigNumber | Fraction | Complex | Array | Matrix} x Number to be rounded
|
|
42
|
+
* @param {number | BigNumber | Array} [n=0] Number of decimals
|
|
43
|
+
* @return {number | BigNumber | Fraction | Complex | Array | Matrix} Rounded value
|
|
34
44
|
*/
|
|
35
45
|
return typed('fix', {
|
|
36
46
|
number: function (x) {
|
|
37
47
|
return (x > 0) ? floor(x) : ceil(x)
|
|
38
48
|
},
|
|
39
49
|
|
|
50
|
+
'number, number | BigNumber': function (x, n) {
|
|
51
|
+
return (x > 0) ? floor(x, n) : ceil(x, n)
|
|
52
|
+
},
|
|
53
|
+
|
|
40
54
|
Complex: function (x) {
|
|
41
55
|
return new Complex(
|
|
42
56
|
(x.re > 0) ? Math.floor(x.re) : Math.ceil(x.re),
|
|
@@ -44,17 +58,42 @@ export const createFix = /* #__PURE__ */ factory(name, dependencies, ({ typed, C
|
|
|
44
58
|
)
|
|
45
59
|
},
|
|
46
60
|
|
|
61
|
+
'Complex, number | BigNumber': function (x, n) {
|
|
62
|
+
return new Complex(
|
|
63
|
+
(x.re > 0) ? floor(x.re, n) : ceil(x.re, n),
|
|
64
|
+
(x.im > 0) ? floor(x.im, n) : ceil(x.im, n)
|
|
65
|
+
)
|
|
66
|
+
},
|
|
67
|
+
|
|
47
68
|
BigNumber: function (x) {
|
|
48
69
|
return x.isNegative() ? ceil(x) : floor(x)
|
|
49
70
|
},
|
|
50
71
|
|
|
72
|
+
'BigNumber, number | BigNumber': function (x, n) {
|
|
73
|
+
return x.isNegative() ? ceil(x, n) : floor(x, n)
|
|
74
|
+
},
|
|
75
|
+
|
|
51
76
|
Fraction: function (x) {
|
|
52
77
|
return x.s < 0 ? x.ceil() : x.floor()
|
|
53
78
|
},
|
|
54
79
|
|
|
80
|
+
'Fraction, number | BigNumber': function (x, n) {
|
|
81
|
+
return x.s < 0 ? x.ceil(n) : x.floor(n)
|
|
82
|
+
},
|
|
83
|
+
|
|
55
84
|
'Array | Matrix': function (x) {
|
|
56
85
|
// deep map collection, skip zeros since fix(0) = 0
|
|
57
86
|
return deepMap(x, this, true)
|
|
87
|
+
},
|
|
88
|
+
|
|
89
|
+
'Array | Matrix, number | BigNumber': function (x, n) {
|
|
90
|
+
// deep map collection, skip zeros since fix(0) = 0
|
|
91
|
+
return deepMap(x, i => this(i, n), true)
|
|
92
|
+
},
|
|
93
|
+
|
|
94
|
+
'number | Complex | BigNumber, Array': function (x, y) {
|
|
95
|
+
// use matrix implementation
|
|
96
|
+
return algorithm14(matrix(y), x, this, true).valueOf()
|
|
58
97
|
}
|
|
59
98
|
})
|
|
60
99
|
})
|
|
@@ -1,12 +1,18 @@
|
|
|
1
|
+
import { Decimal } from 'decimal.js'
|
|
1
2
|
import { factory } from '../../utils/factory'
|
|
2
3
|
import { deepMap } from '../../utils/collection'
|
|
3
4
|
import { nearlyEqual } from '../../utils/number'
|
|
4
5
|
import { nearlyEqual as bigNearlyEqual } from '../../utils/bignumber/nearlyEqual'
|
|
6
|
+
import { createAlgorithm11 } from '../../type/matrix/utils/algorithm11'
|
|
7
|
+
import { createAlgorithm14 } from '../../type/matrix/utils/algorithm14'
|
|
5
8
|
|
|
6
9
|
const name = 'floor'
|
|
7
|
-
const dependencies = ['typed', 'config', 'round']
|
|
10
|
+
const dependencies = ['typed', 'config', 'round', 'matrix', 'equalScalar']
|
|
11
|
+
|
|
12
|
+
export const createFloor = /* #__PURE__ */ factory(name, dependencies, ({ typed, config, round, matrix, equalScalar }) => {
|
|
13
|
+
const algorithm11 = createAlgorithm11({ typed, equalScalar })
|
|
14
|
+
const algorithm14 = createAlgorithm14({ typed })
|
|
8
15
|
|
|
9
|
-
export const createFloor = /* #__PURE__ */ factory(name, dependencies, ({ typed, config, round }) => {
|
|
10
16
|
/**
|
|
11
17
|
* Round a value towards minus infinity.
|
|
12
18
|
* For matrices, the function is evaluated element wise.
|
|
@@ -14,6 +20,7 @@ export const createFloor = /* #__PURE__ */ factory(name, dependencies, ({ typed,
|
|
|
14
20
|
* Syntax:
|
|
15
21
|
*
|
|
16
22
|
* math.floor(x)
|
|
23
|
+
* math.floor(x, n)
|
|
17
24
|
*
|
|
18
25
|
* Examples:
|
|
19
26
|
*
|
|
@@ -22,16 +29,24 @@ export const createFloor = /* #__PURE__ */ factory(name, dependencies, ({ typed,
|
|
|
22
29
|
* math.floor(-4.2) // returns number -5
|
|
23
30
|
* math.floor(-4.7) // returns number -5
|
|
24
31
|
*
|
|
25
|
-
*
|
|
26
|
-
* math.floor(
|
|
32
|
+
* math.floor(3.212, 2) // returns number 3.21
|
|
33
|
+
* math.floor(3.288, 2) // returns number 3.28
|
|
34
|
+
* math.floor(-4.212, 2) // returns number -4.22
|
|
35
|
+
* math.floor(-4.782, 2) // returns number -4.79
|
|
36
|
+
*
|
|
37
|
+
* const c = math.complex(3.24, -2.71)
|
|
38
|
+
* math.floor(c) // returns Complex 3 - 3i
|
|
39
|
+
* math.floor(c, 1) // returns Complex 3.2 - 2.8i
|
|
27
40
|
*
|
|
28
|
-
* math.floor([3.2, 3.8, -4.7])
|
|
41
|
+
* math.floor([3.2, 3.8, -4.7]) // returns Array [3, 3, -5]
|
|
42
|
+
* math.floor([3.21, 3.82, -4.71], 1) // returns Array [3.2, 3.8, -4.8]
|
|
29
43
|
*
|
|
30
44
|
* See also:
|
|
31
45
|
*
|
|
32
46
|
* ceil, fix, round
|
|
33
47
|
*
|
|
34
48
|
* @param {number | BigNumber | Fraction | Complex | Array | Matrix} x Number to be rounded
|
|
49
|
+
* @param {number | BigNumber | Array} [n=0] Number of decimals
|
|
35
50
|
* @return {number | BigNumber | Fraction | Complex | Array | Matrix} Rounded value
|
|
36
51
|
*/
|
|
37
52
|
return typed('floor', {
|
|
@@ -43,10 +58,25 @@ export const createFloor = /* #__PURE__ */ factory(name, dependencies, ({ typed,
|
|
|
43
58
|
}
|
|
44
59
|
},
|
|
45
60
|
|
|
61
|
+
'number, number': function (x, n) {
|
|
62
|
+
if (nearlyEqual(x, round(x, n), config.epsilon)) {
|
|
63
|
+
return round(x, n)
|
|
64
|
+
} else {
|
|
65
|
+
let [number, exponent] = `${x}e`.split('e')
|
|
66
|
+
const result = Math.floor(Number(`${number}e${Number(exponent) + n}`));
|
|
67
|
+
[number, exponent] = `${result}e`.split('e')
|
|
68
|
+
return Number(`${number}e${Number(exponent) - n}`)
|
|
69
|
+
}
|
|
70
|
+
},
|
|
71
|
+
|
|
46
72
|
Complex: function (x) {
|
|
47
73
|
return x.floor()
|
|
48
74
|
},
|
|
49
75
|
|
|
76
|
+
'Complex, number': function (x, n) {
|
|
77
|
+
return x.floor(n)
|
|
78
|
+
},
|
|
79
|
+
|
|
50
80
|
BigNumber: function (x) {
|
|
51
81
|
if (bigNearlyEqual(x, round(x), config.epsilon)) {
|
|
52
82
|
return round(x)
|
|
@@ -55,13 +85,43 @@ export const createFloor = /* #__PURE__ */ factory(name, dependencies, ({ typed,
|
|
|
55
85
|
}
|
|
56
86
|
},
|
|
57
87
|
|
|
88
|
+
'BigNumber, BigNumber': function (x, n) {
|
|
89
|
+
if (bigNearlyEqual(x, round(x, n), config.epsilon)) {
|
|
90
|
+
return round(x, n)
|
|
91
|
+
} else {
|
|
92
|
+
return x.toDecimalPlaces(n.toNumber(), Decimal.ROUND_FLOOR)
|
|
93
|
+
}
|
|
94
|
+
},
|
|
95
|
+
|
|
58
96
|
Fraction: function (x) {
|
|
59
97
|
return x.floor()
|
|
60
98
|
},
|
|
61
99
|
|
|
100
|
+
'Fraction, number': function (x, n) {
|
|
101
|
+
return x.floor(n)
|
|
102
|
+
},
|
|
103
|
+
|
|
62
104
|
'Array | Matrix': function (x) {
|
|
63
105
|
// deep map collection, skip zeros since floor(0) = 0
|
|
64
106
|
return deepMap(x, this, true)
|
|
107
|
+
},
|
|
108
|
+
|
|
109
|
+
'Array | Matrix, number': function (x, n) {
|
|
110
|
+
// deep map collection, skip zeros since ceil(0) = 0
|
|
111
|
+
return deepMap(x, i => this(i, n), true)
|
|
112
|
+
},
|
|
113
|
+
|
|
114
|
+
'SparseMatrix, number | BigNumber': function (x, y) {
|
|
115
|
+
return algorithm11(x, y, this, false)
|
|
116
|
+
},
|
|
117
|
+
|
|
118
|
+
'DenseMatrix, number | BigNumber': function (x, y) {
|
|
119
|
+
return algorithm14(x, y, this, false)
|
|
120
|
+
},
|
|
121
|
+
|
|
122
|
+
'number | Complex | BigNumber, Array': function (x, y) {
|
|
123
|
+
// use matrix implementation
|
|
124
|
+
return algorithm14(matrix(y), x, this, true).valueOf()
|
|
65
125
|
}
|
|
66
126
|
})
|
|
67
127
|
})
|
|
@@ -34,10 +34,14 @@ export const createRound = /* #__PURE__ */ factory(name, dependencies, ({ typed,
|
|
|
34
34
|
*
|
|
35
35
|
* Examples:
|
|
36
36
|
*
|
|
37
|
-
* math.round(3.
|
|
38
|
-
* math.round(3.
|
|
37
|
+
* math.round(3.22) // returns number 3
|
|
38
|
+
* math.round(3.82) // returns number 4
|
|
39
39
|
* math.round(-4.2) // returns number -4
|
|
40
40
|
* math.round(-4.7) // returns number -5
|
|
41
|
+
* math.round(3.22, 1) // returns number 3.2
|
|
42
|
+
* math.round(3.88, 1) // returns number 3.8
|
|
43
|
+
* math.round(-4.21, 1) // returns number -4.2
|
|
44
|
+
* math.round(-4.71, 1) // returns number -4.7
|
|
41
45
|
* math.round(math.pi, 3) // returns number 3.142
|
|
42
46
|
* math.round(123.45678, 2) // returns number 123.46
|
|
43
47
|
*
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { factory } from '../../utils/factory'
|
|
2
|
+
import { arraySize } from '../../utils/array'
|
|
3
|
+
|
|
4
|
+
const name = 'rotate'
|
|
5
|
+
const dependencies = [
|
|
6
|
+
'typed',
|
|
7
|
+
'multiply',
|
|
8
|
+
'rotationMatrix'
|
|
9
|
+
]
|
|
10
|
+
|
|
11
|
+
export const createRotate = /* #__PURE__ */ factory(name, dependencies, (
|
|
12
|
+
{
|
|
13
|
+
typed, multiply, rotationMatrix
|
|
14
|
+
}) => {
|
|
15
|
+
/**
|
|
16
|
+
* Rotate a vector of size 1x2 counter-clockwise by a given angle
|
|
17
|
+
* Rotate a vector of size 1x3 counter-clockwise by a given angle around the given axis
|
|
18
|
+
*
|
|
19
|
+
* Syntax:
|
|
20
|
+
*
|
|
21
|
+
* math.rotate(w, theta)
|
|
22
|
+
* math.rotate(w, theta, v)
|
|
23
|
+
*
|
|
24
|
+
* Examples:
|
|
25
|
+
*
|
|
26
|
+
* math.rotate([11, 12], math.pi / 2) // returns matrix([-12, 11])
|
|
27
|
+
* math.rotate(matrix([11, 12]), math.pi / 2) // returns matrix([-12, 11])
|
|
28
|
+
*
|
|
29
|
+
* math.rotate([1, 0, 0], unit('90deg'), [0, 0, 1]) // returns matrix([0, 1, 0])
|
|
30
|
+
* math.rotate(matrix([1, 0, 0]), unit('90deg'), [0, 0, 1]) // returns matrix([0, 1, 0])
|
|
31
|
+
*
|
|
32
|
+
* math.rotate([1, 0], math.complex(1 + i)) // returns matrix([cos(1 + i) - sin(1 + i), sin(1 + i) + cos(1 + i)])
|
|
33
|
+
*
|
|
34
|
+
* See also:
|
|
35
|
+
*
|
|
36
|
+
* matrix, rotationMatrix
|
|
37
|
+
*
|
|
38
|
+
* @param {Array | Matrix} w Vector to rotate
|
|
39
|
+
* @param {number | BigNumber | Complex | Unit} theta Rotation angle
|
|
40
|
+
* @param {Array | Matrix} [v] Rotation axis
|
|
41
|
+
* @return {Array | Matrix} Multiplication of the rotation matrix and w
|
|
42
|
+
*/
|
|
43
|
+
return typed(name, {
|
|
44
|
+
'Array , number | BigNumber | Complex | Unit': function (w, theta) {
|
|
45
|
+
_validateSize(w, 2)
|
|
46
|
+
const matrixRes = multiply(rotationMatrix(theta), w)
|
|
47
|
+
return matrixRes.toArray()
|
|
48
|
+
},
|
|
49
|
+
|
|
50
|
+
'Matrix , number | BigNumber | Complex | Unit': function (w, theta) {
|
|
51
|
+
_validateSize(w, 2)
|
|
52
|
+
return multiply(rotationMatrix(theta), w)
|
|
53
|
+
},
|
|
54
|
+
|
|
55
|
+
'Array, number | BigNumber | Complex | Unit, Array | Matrix': function (w, theta, v) {
|
|
56
|
+
_validateSize(w, 3)
|
|
57
|
+
const matrixRes = multiply(rotationMatrix(theta, v), w)
|
|
58
|
+
return matrixRes
|
|
59
|
+
},
|
|
60
|
+
|
|
61
|
+
'Matrix, number | BigNumber | Complex | Unit, Array | Matrix': function (w, theta, v) {
|
|
62
|
+
_validateSize(w, 3)
|
|
63
|
+
return multiply(rotationMatrix(theta, v), w)
|
|
64
|
+
}
|
|
65
|
+
})
|
|
66
|
+
|
|
67
|
+
function _validateSize (v, expectedSize) {
|
|
68
|
+
const actualSize = Array.isArray(v) ? arraySize(v) : v.size()
|
|
69
|
+
if (actualSize.length > 2) {
|
|
70
|
+
throw new RangeError(`Vector must be of dimensions 1x${expectedSize}`)
|
|
71
|
+
}
|
|
72
|
+
if (actualSize.length === 2 && actualSize[1] !== 1) {
|
|
73
|
+
throw new RangeError(`Vector must be of dimensions 1x${expectedSize}`)
|
|
74
|
+
}
|
|
75
|
+
if (actualSize[0] !== expectedSize) {
|
|
76
|
+
throw new RangeError(`Vector must be of dimensions 1x${expectedSize}`)
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
})
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import { isBigNumber } from '../../utils/is'
|
|
2
|
+
import { factory } from '../../utils/factory'
|
|
3
|
+
|
|
4
|
+
const name = 'rotationMatrix'
|
|
5
|
+
const dependencies = [
|
|
6
|
+
'typed',
|
|
7
|
+
'config',
|
|
8
|
+
'multiplyScalar',
|
|
9
|
+
'addScalar',
|
|
10
|
+
'unaryMinus',
|
|
11
|
+
'norm',
|
|
12
|
+
'matrix',
|
|
13
|
+
'BigNumber',
|
|
14
|
+
'DenseMatrix',
|
|
15
|
+
'SparseMatrix',
|
|
16
|
+
'cos',
|
|
17
|
+
'sin'
|
|
18
|
+
]
|
|
19
|
+
|
|
20
|
+
export const createRotationMatrix = /* #__PURE__ */ factory(name, dependencies, (
|
|
21
|
+
{
|
|
22
|
+
typed, config, multiplyScalar,
|
|
23
|
+
addScalar, unaryMinus, norm, BigNumber,
|
|
24
|
+
matrix, DenseMatrix, SparseMatrix, cos, sin
|
|
25
|
+
}) => {
|
|
26
|
+
/**
|
|
27
|
+
* Create a 2-dimensional counter-clockwise rotation matrix (2x2) for a given angle (expressed in radians).
|
|
28
|
+
* Create a 2-dimensional counter-clockwise rotation matrix (3x3) by a given angle (expressed in radians) around a given axis (1x3).
|
|
29
|
+
*
|
|
30
|
+
* Syntax:
|
|
31
|
+
*
|
|
32
|
+
* math.rotationMatrix(theta)
|
|
33
|
+
* math.rotationMatrix(theta, format)
|
|
34
|
+
* math.rotationMatrix(theta, [v])
|
|
35
|
+
* math.rotationMatrix(theta, [v], format)
|
|
36
|
+
*
|
|
37
|
+
* Examples:
|
|
38
|
+
*
|
|
39
|
+
* math.rotationMatrix(math.pi / 2) // returns [[0, -1], [1, 0]]
|
|
40
|
+
* math.rotationMatrix(math.bignumber(1)) // returns [[bignumber(cos(1)), bignumber(-sin(1))], [bignumber(sin(1)), bignumber(cos(1))]]
|
|
41
|
+
* math.rotationMatrix(math.complex(1 + i)) // returns [[cos(1 + i), -sin(1 + i)], [sin(1 + i), cos(1 + i)]]
|
|
42
|
+
* math.rotationMatrix(math.unit('1rad')) // returns [[cos(1), -sin(1)], [sin(1), cos(1)]]
|
|
43
|
+
*
|
|
44
|
+
* math.rotationMatrix(math.pi / 2, [0, 1, 0]) // returns [[0, 0, 1], [0, 1, 0], [-1, 0, 0]]
|
|
45
|
+
* math.rotationMatrix(math.pi / 2, matrix([0, 1, 0])) // returns matrix([[0, 0, 1], [0, 1, 0], [-1, 0, 0]])
|
|
46
|
+
*
|
|
47
|
+
*
|
|
48
|
+
* See also:
|
|
49
|
+
*
|
|
50
|
+
* matrix, cos, sin
|
|
51
|
+
*
|
|
52
|
+
*
|
|
53
|
+
* @param {number | BigNumber | Complex | Unit} theta Rotation angle
|
|
54
|
+
* @param {Array | Matrix} [v] Rotation axis
|
|
55
|
+
* @param {string} [format] Result Matrix storage format
|
|
56
|
+
* @return {Array | Matrix} Rotation matrix
|
|
57
|
+
*/
|
|
58
|
+
|
|
59
|
+
return typed(name, {
|
|
60
|
+
'': function () {
|
|
61
|
+
return (config.matrix === 'Matrix') ? matrix([]) : []
|
|
62
|
+
},
|
|
63
|
+
|
|
64
|
+
string: function (format) {
|
|
65
|
+
return matrix(format)
|
|
66
|
+
},
|
|
67
|
+
|
|
68
|
+
'number | BigNumber | Complex | Unit': function (theta) {
|
|
69
|
+
return _rotationMatrix2x2(theta, config.matrix === 'Matrix' ? 'dense' : undefined)
|
|
70
|
+
},
|
|
71
|
+
|
|
72
|
+
'number | BigNumber | Complex | Unit, string': function (theta, format) {
|
|
73
|
+
return _rotationMatrix2x2(theta, format)
|
|
74
|
+
},
|
|
75
|
+
|
|
76
|
+
'number | BigNumber | Complex | Unit, Array': function (theta, v) {
|
|
77
|
+
const matrixV = matrix(v)
|
|
78
|
+
_validateVector(matrixV)
|
|
79
|
+
return _rotationMatrix3x3(theta, matrixV, undefined)
|
|
80
|
+
},
|
|
81
|
+
|
|
82
|
+
'number | BigNumber | Complex | Unit, Matrix': function (theta, v) {
|
|
83
|
+
_validateVector(v)
|
|
84
|
+
const storageType = v.storage() || (config.matrix === 'Matrix' ? 'dense' : undefined)
|
|
85
|
+
return _rotationMatrix3x3(theta, v, storageType)
|
|
86
|
+
},
|
|
87
|
+
|
|
88
|
+
'number | BigNumber | Complex | Unit, Array, string': function (theta, v, format) {
|
|
89
|
+
const matrixV = matrix(v)
|
|
90
|
+
_validateVector(matrixV)
|
|
91
|
+
return _rotationMatrix3x3(theta, matrixV, format)
|
|
92
|
+
},
|
|
93
|
+
|
|
94
|
+
'number | BigNumber | Complex | Unit, Matrix, string': function (theta, v, format) {
|
|
95
|
+
_validateVector(v)
|
|
96
|
+
return _rotationMatrix3x3(theta, v, format)
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
})
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Returns 2x2 matrix of 2D rotation of angle theta
|
|
103
|
+
*
|
|
104
|
+
* @param {number | BigNumber | Complex | Unit} theta The rotation angle
|
|
105
|
+
* @param {string} format The result Matrix storage format
|
|
106
|
+
* @returns {Matrix}
|
|
107
|
+
* @private
|
|
108
|
+
*/
|
|
109
|
+
function _rotationMatrix2x2 (theta, format) {
|
|
110
|
+
const Big = isBigNumber(theta)
|
|
111
|
+
|
|
112
|
+
const minusOne = Big ? new BigNumber(-1) : -1
|
|
113
|
+
const cosTheta = cos(theta)
|
|
114
|
+
const sinTheta = sin(theta)
|
|
115
|
+
const data = [[cosTheta, multiplyScalar(minusOne, sinTheta)], [sinTheta, cosTheta]]
|
|
116
|
+
|
|
117
|
+
return _convertToFormat(data, format)
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
function _validateVector (v) {
|
|
121
|
+
const size = v.size()
|
|
122
|
+
if (size.length < 1 || size[0] !== 3) {
|
|
123
|
+
throw new RangeError('Vector must be of dimensions 1x3')
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
function _mul (array) {
|
|
128
|
+
return array.reduce((p, curr) => multiplyScalar(p, curr))
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
function _convertToFormat (data, format) {
|
|
132
|
+
if (format) {
|
|
133
|
+
if (format === 'sparse') {
|
|
134
|
+
return new SparseMatrix(data)
|
|
135
|
+
}
|
|
136
|
+
if (format === 'dense') {
|
|
137
|
+
return new DenseMatrix(data)
|
|
138
|
+
}
|
|
139
|
+
throw new TypeError(`Unknown matrix type "${format}"`)
|
|
140
|
+
}
|
|
141
|
+
return data
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Returns a 3x3 matrix of rotation of angle theta around vector v
|
|
146
|
+
*
|
|
147
|
+
* @param {number | BigNumber | Complex | Unit} theta The rotation angle
|
|
148
|
+
* @param {Matrix} v The rotation axis vector
|
|
149
|
+
* @param {string} format The storage format of the resulting matrix
|
|
150
|
+
* @returns {Matrix}
|
|
151
|
+
* @private
|
|
152
|
+
*/
|
|
153
|
+
function _rotationMatrix3x3 (theta, v, format) {
|
|
154
|
+
const normV = norm(v)
|
|
155
|
+
if (normV === 0) {
|
|
156
|
+
throw new RangeError('Rotation around zero vector')
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
const Big = isBigNumber(theta) ? BigNumber : null
|
|
160
|
+
|
|
161
|
+
const one = Big ? new Big(1) : 1
|
|
162
|
+
const minusOne = Big ? new Big(-1) : -1
|
|
163
|
+
const vx = Big ? new Big(v.get([0]) / normV) : v.get([0]) / normV
|
|
164
|
+
const vy = Big ? new Big(v.get([1]) / normV) : v.get([1]) / normV
|
|
165
|
+
const vz = Big ? new Big(v.get([2]) / normV) : v.get([2]) / normV
|
|
166
|
+
const c = cos(theta)
|
|
167
|
+
const oneMinusC = addScalar(one, unaryMinus(c))
|
|
168
|
+
const s = sin(theta)
|
|
169
|
+
|
|
170
|
+
const r11 = addScalar(c, _mul([vx, vx, oneMinusC]))
|
|
171
|
+
const r12 = addScalar(_mul([vx, vy, oneMinusC]), _mul([minusOne, vz, s]))
|
|
172
|
+
const r13 = addScalar(_mul([vx, vz, oneMinusC]), _mul([vy, s]))
|
|
173
|
+
|
|
174
|
+
const r21 = addScalar(_mul([vx, vy, oneMinusC]), _mul([vz, s]))
|
|
175
|
+
const r22 = addScalar(c, _mul([vy, vy, oneMinusC]))
|
|
176
|
+
const r23 = addScalar(_mul([vy, vz, oneMinusC]), _mul([minusOne, vx, s]))
|
|
177
|
+
|
|
178
|
+
const r31 = addScalar(_mul([vx, vz, oneMinusC]), _mul([minusOne, vy, s]))
|
|
179
|
+
const r32 = addScalar(_mul([vy, vz, oneMinusC]), _mul([vx, s]))
|
|
180
|
+
const r33 = addScalar(c, _mul([vz, vz, oneMinusC]))
|
|
181
|
+
|
|
182
|
+
const data = [[r11, r12, r13], [r21, r22, r23], [r31, r32, r33]]
|
|
183
|
+
|
|
184
|
+
return _convertToFormat(data, format)
|
|
185
|
+
}
|
|
186
|
+
})
|
|
@@ -87,6 +87,10 @@ export const createSqrtm = /* #__PURE__ */ factory(name, dependencies, ({ typed,
|
|
|
87
87
|
'(size: ' + format(size) + ')')
|
|
88
88
|
}
|
|
89
89
|
}
|
|
90
|
+
default:
|
|
91
|
+
// Multi dimensional array
|
|
92
|
+
throw new RangeError('Matrix must be at most two dimensional ' +
|
|
93
|
+
'(size: ' + format(size) + ')')
|
|
90
94
|
}
|
|
91
95
|
}
|
|
92
96
|
})
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { factory } from '../../utils/factory'
|
|
2
2
|
import { isNumber } from '../../utils/is'
|
|
3
|
-
import { arraySize } from '../../utils/array'
|
|
4
3
|
import { createRng } from './util/seededRNG'
|
|
4
|
+
import { flatten } from '../../utils/array'
|
|
5
5
|
|
|
6
6
|
const name = 'pickRandom'
|
|
7
7
|
const dependencies = ['typed', 'config', '?on']
|
|
@@ -76,15 +76,11 @@ export const createPickRandom = /* #__PURE__ */ factory(name, dependencies, ({ t
|
|
|
76
76
|
number = 1
|
|
77
77
|
}
|
|
78
78
|
|
|
79
|
-
possibles = possibles.valueOf() // get Array
|
|
79
|
+
possibles = flatten(possibles.valueOf()).valueOf() // get Array
|
|
80
80
|
if (weights) {
|
|
81
81
|
weights = weights.valueOf() // get Array
|
|
82
82
|
}
|
|
83
83
|
|
|
84
|
-
if (arraySize(possibles).length > 1) {
|
|
85
|
-
throw new Error('Only one dimensional vectors supported')
|
|
86
|
-
}
|
|
87
|
-
|
|
88
84
|
let totalWeights = 0
|
|
89
85
|
|
|
90
86
|
if (typeof weights !== 'undefined') {
|