如何使用nalgebra分配静态SMatrix/SVector?
解决nalgebra中SVector无法声明为const变量的问题
针对你遇到的SVector<f64,7>无法用nalgebra自带方法声明为const变量的问题,有以下几种可行方案:
方案1:升级nalgebra到支持const构造的版本
如果你的nalgebra版本低于0.32.x,建议升级到最新稳定版。新版中SVector::from(接收固定大小数组)已被标记为const函数,可以直接用数组构造const变量:
use nalgebra::SVector; const C5: SVector<f64, 7> = SVector::from([ 5179.0 / 57600.0, 0.0, 7571.0 / 16695.0, 393.0 / 640.0, -92097.0 / 339200.0, 187.0 / 2100.0, 1.0 / 40.0, ]);
方案2:使用lazy_static/once_cell实现运行时初始化的静态变量
如果无法升级库版本,或者不需要编译期const变量,只是需要全局静态变量,可以用lazy_static或once_cell库实现延迟初始化:
use lazy_static::lazy_static; use nalgebra::SVector; lazy_static! { static ref C5: SVector<f64, 7> = SVector::from_row_slice(&[ 5179.0 / 57600.0, 0.0, 7571.0 / 16695.0, 393.0 / 640.0, -92097.0 / 339200.0, 187.0 / 2100.0, 1.0 / 40.0, ]); }
使用时直接通过*C5访问即可,首次访问时会完成初始化,后续复用同一个实例。
方案3:手动实现const构造函数(unsafe)
如果必须在编译期初始化,且无法升级库,可以利用SVector与数组布局一致的特性,自己实现一个const构造函数:
use nalgebra::SVector; const fn svector_from_array<T, const D: usize>(arr: [T; D]) -> SVector<T, D> { unsafe { std::mem::transmute(arr) } } const C5: SVector<f64, 7> = svector_from_array([ 5179.0 / 57600.0, 0.0, 7571.0 / 16695.0, 393.0 / 640.0, -92097.0 / 339200.0, 187.0 / 2100.0, 1.0 / 40.0, ]);
注意:该方法依赖nalgebra的内部实现(SVector是数组的透明包装),虽然当前版本是安全的,但如果未来库修改了布局,可能会导致未定义行为,需谨慎使用。
内容的提问来源于stack exchange,提问作者mcmuffin6o
相关产品推荐
相关产品推荐

