#线性代数 #矩阵运算 #四元数 #机器人技术 #数组 #双四元数

无std static-math

使用静态数组进行快速数学运算,无需unsafe代码

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 数学

MIT许可协议

390KB
9K SLoC

MIT Documentation crates.io

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