14个版本
0.2.3 | 2021年8月5日 |
---|---|
0.2.1 | 2021年7月31日 |
0.1.7 | 2020年9月13日 |
0.1.1 | 2020年6月28日 |
#254 in 数学
390KB
9K SLoC
Rust编程语言中的静态Math
"简单的事情应该简单,复杂的事情应该可行" Alan Kay.
-
这个crate利用Rust中的静态数组在堆栈内存中进行快速操作。
-
我们使用元组来索引元素:
m[(i, j)]
,允许与Rust的match
特性有良好的接口 -
没有
unsafe
代码 ☑️ -
可以借助SIMD进一步优化
-
这个crate可以用于
no-std
环境。通过启用
no-std
特性,例如在你的Cargo.toml
[dependencies.static-math] default-features = false version = "0.2.0" features = ["no-std"]
-
你可以可视化矩阵
inverse:
|-0.54 0.58 0.67 -0.08 -0.17 -1.18|
|2.16 -1.53 -2.44 0.44 0.32 3.77|
|0.21 -0.42 -0.39 0.15 0.20 0.62|
|0.70 -0.24 -0.53 0.20 -0.21 0.73|
|0.85 -0.47 -0.83 0.11 0.11 1.20|
|-3.91 2.47 4.17 -0.87 -0.31 -6.08|
-
矩阵的行列式是通过“就地”计算得出的,没有循环和代码分支
-
使用场景可以是:机器人技术、游戏编程、模拟等。
矩阵类型Mnn(其中
n=2..6
)实现了LinearAlgebra
特质的 方法
-
det()
:矩阵的行列式 -
inverse()
:矩阵的逆 -
qr()
:矩阵的QR分解 -
norm2()
:矩阵的范数 -
transpose()
:矩阵的转置 -
trace()
:矩阵的迹 -
shape()
:矩阵的形状 -
我们实现了
Quaternion
(及其所有最常用的方法) -
我们实现了
DualQuaternion
(及其在机器人学和图形学中常用的方法,如螺旋线性插值) -
在
transformations.rs
模块中,我们实现了在机器人学中广泛使用的各种函数(符合螺旋理论)
基准测试
使用criterion crate
https://github.com/bheisler/criterion.rs
运行方式:cargo bench
与其他crate的性能比较的其他基准测试在本存储库中: https://github.com/bitshifter/mathbench-rs
注意:这是唯一没有使用unsafe代码的crate
以下结果
基准测试 | glam | cgmath | nalgebra | euclid | vek | pathfinder | static-math | ultraviolet |
---|---|---|---|---|---|---|---|---|
euler 2d x10000 | 7.555 us | 7.521 us | 16.38 us | 11.86 us | 7.513 us | 9.806 us | 11.83 us | 7.499 us |
euler 3d x10000 | 16.2 us | 25.04 us | 106.3 us | 25.05 us | 25.16 us | 16.76 us | 25.03 us | 25.05 us |
matrix2 determinant | 2.0332 ns | 2.0311 ns | 2.0250 ns | N/A | 2.0209 ns | 2.0323 ns | 2.0254 ns | N/A |
matrix2 inverse | 2.6114 ns | 3.0331 ns | 2.9792 ns | N/A | N/A | 2.7550 ns | 3.0132 ns | N/A |
matrix2 mul matrix2 | 2.6047 ns | 2.5346 ns | 2.5426 ns | N/A | 8.7573 ns | 2.5381 ns | 2.6028 ns | 2.9668 ns |
matrix2 mul vector2 x1 | 2.6592 ns | 2.6104 ns | 2.6214 ns | N/A | 4.2512 ns | 2.0663 ns | 2.8674 ns | 2.6172 ns |
matrix2 mul vector2 x100 | 245.2897 ns | 233.7149 ns | 238.7395 ns | N/A | 399.3148 ns | 218.4107 ns | 260.6645 ns | 234.7099 ns |
matrix2 return self | 2.4740 ns | 2.5994 ns | 2.5968 ns | N/A | 2.5969 ns | 2.4607 ns | 2.5928 ns | 2.5974 ns |
matrix2 transpose | 2.0852 ns | 2.0814 ns | 2.3426 ns | N/A | 2.1053 ns | N/A | 2.0829 ns | N/A |
matrix3 determinant | 3.3675 ns | 3.4261 ns | 3.3780 ns | N/A | 3.4479 ns | N/A | 3.4375 ns | N/A |
matrix3 inverse | 11.4209 ns | 8.3701 ns | 9.4315 ns | N/A | N/A | N/A | 9.1710 ns | 20.1731 ns |
matrix3 mul matrix3 | 5.8501 ns | 6.5350 ns | 9.8196 ns | N/A | 47.9203 ns | N/A | 9.5170 ns | 6.5211 ns |
matrix3 mul vector3 x1 | 3.9266 ns | 4.3876 ns | 4.3333 ns | N/A | 16.0858 ns | N/A | 4.4220 ns | 4.3304 ns |
matrix3 mul vector3 x100 | 0.4372 us | 0.4416 us | 0.4594 us | N/A | 1.59 us | N/A | 0.454 us | 0.4425 us |
matrix3 return self | 4.8566 ns | 4.8401 ns | 4.8226 ns | N/A | 4.8340 ns | N/A | 4.8303 ns | 4.8383 ns |
matrix3 transpose | 5.7688 ns | 5.6980 ns | 8.1508 ns | N/A | 5.6910 ns | N/A | 5.6936 ns | 5.6766 ns |
matrix4 determinant | 8.3724 ns | 11.1604 ns | 52.8697 ns | 16.0723 ns | 17.5301 ns | N/A | 16.1402 ns | N/A |
matrix4 inverse | 21.3281 纳秒 | 38.5833 纳秒 | 64.5172 纳秒 | 61.2347 纳秒 | 275.5253 纳秒 | N/A | 48.0641 纳秒 | 37.1436 纳秒 |
matrix4 乘以 matrix4 | 7.5043 纳秒 | 8.3723 纳秒 | 9.4094 纳秒 | 10.1761 纳秒 | 90.7185 纳秒 | N/A | 20.6424 纳秒 | 8.4072 纳秒 |
matrix4 乘以 vector4 x1 | 3.3645 纳秒 | 3.7273 纳秒 | 3.7251 纳秒 | N/A | 24.2185 纳秒 | N/A | 6.1311 纳秒 | 3.7524 纳秒 |
matrix4 乘以 vector4 x100 | 0.6105 微秒 | 0.6237 微秒 | 0.6202 微秒 | N/A | 2.402 微秒 | N/A | 0.7044 微秒 | 0.6202 微秒 |
matrix4 返回自身 | 6.8863 纳秒 | 7.1298 纳秒 | 6.6961 纳秒 | N/A | 6.7079 纳秒 | N/A | 6.6772 纳秒 | 6.7079 纳秒 |
matrix4 转置 | 5.7312 纳秒 | 10.1612 纳秒 | 14.9424 纳秒 | N/A | 10.2015 纳秒 | N/A | 10.1996 纳秒 | 10.2391 纳秒 |
rotation3 逆运算 | 2.1867 纳秒 | 2.9086 纳秒 | 2.8853 纳秒 | 2.9092 纳秒 | 2.8987 纳秒 | N/A | N/A | 2.9064 纳秒 |
rotation3 乘以 rotation3 | 3.3422 纳秒 | 4.3602 纳秒 | 7.0680 纳秒 | 7.7111 纳秒 | 8.9616 纳秒 | N/A | N/A | 18.4088 纳秒 |
rotation3 乘以 vector3 | 6.6977 纳秒 | 6.7831 纳秒 | 6.9924 纳秒 | 6.9801 纳秒 | 32.8778 纳秒 | N/A | N/A | 13.5267 纳秒 |
rotation3 返回自身 | 2.4622 纳秒 | 2.5983 纳秒 | 2.6021 纳秒 | N/A | 2.5989 纳秒 | N/A | N/A | 2.5980 纳秒 |
transform point2 x1 | 3.8946 纳秒 | 2.8843 纳秒 | 4.6543 纳秒 | 3.2271 纳秒 | 17.0089 纳秒 | 2.3608 纳秒 | N/A | N/A |
transform point2 x100 | 0.4265 微秒 | 0.3677 微秒 | 0.4632 微秒 | 0.322 微秒 | 1.712 微秒 | 0.3206 微秒 | N/A | N/A |
transform point3 x1 | 4.9958 纳秒 | 6.3712 纳秒 | 6.6426 纳秒 | 6.1114 纳秒 | 24.8255 纳秒 | 3.1011 纳秒 | N/A | N/A |
transform point3 x100 | 0.6261 微秒 | 0.7418 微秒 | 0.7447 微秒 | 0.7296 微秒 | 2.507 微秒 | 0.6295 微秒 | N/A | N/A |
transform vector2 x1 | 2.7159 纳秒 | N/A | 3.9917 纳秒 | 2.8070 纳秒 | 16.8257 纳秒 | N/A | N/A | N/A |
transform vector2 x100 | 0.3463 微秒 | N/A | 0.4018 微秒 | 0.2893 微秒 | 1.709 微秒 | N/A | N/A | N/A |
transform vector3 x1 | 3.9868 纳秒 | 5.5573 纳秒 | 8.4892 纳秒 | 4.4068 纳秒 | 25.0274 纳秒 | N/A | N/A | N/A |
transform vector3 x100 | 0.5905 微秒 | 0.6584 微秒 | 0.8936 微秒 | 0.6365 微秒 | 2.513 微秒 | N/A | N/A | N/A |
transform2 逆运算 | N/A | N/A | 9.4094 纳秒 | 4.6388 纳秒 | N/A | 3.9983 纳秒 | N/A | N/A |
transform2 乘以 transform2 | N/A | N/A | 9.8173 纳秒 | 6.2162 纳秒 | N/A | 3.8699 纳秒 | N/A | N/A |
transform2 返回自身 | N/A | N/A | 4.8447 纳秒 | 3.5091 纳秒 | N/A | 4.1391 纳秒 | N/A | N/A |
transform3 逆运算 | N/A | N/A | 65.3982 纳秒 | 52.6160 纳秒 | N/A | 32.0466 纳秒 | N/A | N/A |
transform3 乘以 transform3d | N/A | N/A | 10.9731 纳秒 | 9.9741 纳秒 | N/A | 7.6754 纳秒 | N/A | N/A |
transform3 返回自身 | N/A | N/A | 7.1596 纳秒 | 6.6096 纳秒 | N/A | 7.0148 纳秒 | N/A | N/A |
vector3 交叉 | 2.4542 纳秒 | 3.5894 纳秒 | 3.2434 纳秒 | 3.4923 纳秒 | 3.5150 纳秒 | N/A | 3.2947 纳秒 | 7.1968 纳秒 |
vector3 点乘 | 2.1001 纳秒 | 2.3025 纳秒 | 2.2986 纳秒 | 2.3030 纳秒 | 2.3084 纳秒 | N/A | 2.3072 纳秒 | 3.7322 纳秒 |
vector3 长度 | 2.1722 纳秒 | 2.1747 纳秒 | 2.3414 纳秒 | 2.1716 纳秒 | 2.2151 纳秒 | N/A | 2.2063 纳秒 | 3.4787 纳秒 |
vector3 归一化 | 4.4248 纳秒 | 4.3266 纳秒 | 8.1124 纳秒 | 8.0704 纳秒 | 8.0747 纳秒 | N/A | N/A | 8.0778 纳秒 |
vector3 返回自身 | 2.4642 纳秒 | 2.9591 纳秒 | 2.9586 纳秒 | N/A | 2.9579 纳秒 | N/A | 2.9633 纳秒 | 2.9572 纳秒 |
TODOS
-
Quaternion
类型和方法 -
expm()
: 指数矩阵实现 - 特征值
- QR分解
依赖项
~1MB
~18K SLoC