如何用同尺寸SVector替换大SVector区段?fixed_rows_mut赋值失败原因?
替换SVector区段的赋值问题
问题描述
需要用SVector<f64, 10>存储数据,在循环中用SVector<f64, 2>替换该向量中长度为2的区段,尝试代码如下:
let a = SVector::<f64, 10>::default(); for i in 0..5 { let newvec = SVector::<f64, 2>::new(1.0, 2.0); a.fixed_rows_mut::<2>(2 * i) = newvec; // 编译报错 }
编译报错信息:
error[E0070]: invalid left-hand side of assignment --> src/main.rs:9:38 | 9 | a.fixed_rows_mut::<2>(2 * i) = newvec; | ---------------------------- ^ | | | cannot assign to this expression For more information about this error, try `rustc --explain E0070`. error: could not compile `playground` (bin "playground") due to previous error
错误原因
fixed_rows_mut::<2>(idx)返回的是MutFixedRows视图类型,它不是可直接赋值的左值,Rust不允许直接对方法返回值做赋值操作,需通过视图提供的方法完成数据复制。- 原代码中
a是不可变绑定(let a),即使语法正确也无法修改,必须声明为可变绑定。
解决方案
方法1:使用assign方法
MutFixedRows实现了匹配维度的Assign<SVector> trait,可直接调用assign完成数据复制:
use nalgebra::SVector; fn main() { let mut a = SVector::<f64, 10>::default(); for i in 0..5 { let newvec = SVector::<f64, 2>::new(1.0, 2.0); a.fixed_rows_mut::<2>(2 * i).assign(newvec); } println!("{a}"); }
方法2:使用copy_from_slice方法
将SVector转为切片,通过通用切片复制方法完成替换:
use nalgebra::SVector; fn main() { let mut a = SVector::<f64, 10>::default(); for i in 0..5 { let newvec = SVector::<f64, 2>::new(1.0, 2.0); a.fixed_rows_mut::<2>(2 * i).copy_from_slice(newvec.as_slice()); } println!("{a}"); }
两种方法均能实现区段替换,assign更适配SVector场景,copy_from_slice是通用的切片复制方式。
内容的提问来源于stack exchange,提问作者exocortex
相关产品推荐
相关产品推荐

