mathjs 7.3.0 → 7.6.0
Sign up to get free protection for your applications and to get access to all the features.
- 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') {
|