Matthew Pittenger
Matthew Pittenger

Reputation: 149

How to sum elements of Vec<Vec<f64>> together into a Vec<f64>?

I am looking for an "rusty" way to accumulate a Vec<Vec> into a Vec such that the 1st element of every inner Vec is summed together, every 2nd element of each Vec is summed together, etc..., and the results are collected into a Vec? If I just use sum(), fold(), or accumulate() I believe I will sum entire 1st Vec together into a single element, rather than the 1st element of each inner Vec contained in the 2D Vec.

pub fn main() {
    let v1 = vec![1.1, 2.2, 3.3];
    let vv = vec![v1; 3];
    let desired_result = vec![3.3, 6.6, 9.9];
}

Upvotes: 4

Views: 1364

Answers (3)

Netwave
Netwave

Reputation: 42786

Also if knowing beforehand the size of the inner vectors (or taking it from the first occurence in the vv vector), you can use a range iterator:

pub fn main() {
    let v1 = vec![1.1, 2.2, 3.3];
    let v1_len = v1.len();
    let vv = vec![v1; 3];
    let res: Vec<f64> = (0..v1_len)
        .map(|i| vv.iter().map(|v| v.get(i).unwrap()).sum())
        .collect();
    println!("{res:?}");
}

Playground

Upvotes: 0

isaactfa
isaactfa

Reputation: 6657

While I prefer @orlp's solution, if you're hell-bent on doing this the most functionally possible, you could do it like this:

let v1 = vec![1.1, 2.2, 3.3];
let vv = vec![v1; 3];
let sums = vec![0.0; vv[0].len()];
let summed = vv.into_iter().fold(sums, |mut sums, v| {
    v.into_iter().enumerate().for_each(|(i, x)| sums[i] += x);
    sums
});

Upvotes: 2

orlp
orlp

Reputation: 117846

Sometimes it's easy to forget in Rust that the imperative approach exists and is an easy solution.

let mut sums = vec![0.0; vv[0].len()];
for v in vv {
    for (i, x) in v.into_iter().enumerate() {
        sums[i] += x;
    }
}

Upvotes: 6

Related Questions