I have a struct body struct that contains planet info such as position velocity etc
pub struct Body {
pub id: u8,
pub pos: Vec<f64>,
pub vel: Vec<f64>,
}
pub struct Data {
pub system_vec: Vec<Body>,
}
To put all the pos/vel vecs into a nalgebra matrix I need to first flatten all the body vecs into an iterator I can feed to the nalgebra api.
let ncols: &usize = &self.system_vec.len();
let temp_vec = &data.system_vec
.iter()
.map(|body| body.pos.clone())
.collect::<Vec<Vec<f64>>>()
.into_iter()
.flatten()
.collect::<Vec<f64>>();
na::OMatrix::<f64, U3, Dyn>::from_iterator(
*ncols,
temp_vec.iter().cloned()
)
My question is this seems to be incredibly over engineered. I'm iterating and then collecting and then iterating again. I'm sure there is a better way but I'm quite new to rust so this is the best I've got so far. Is there a more efficient way to get a cloned version of this data into the matrix?
I've found a more streamlined solution -
let temp_vec = &self.system_vec
.iter()
.flat_map(|body| body.pos.clone().into_iter())
.collect::<Vec<f64>>();