rust で 行列のaxisごとのsumをする

行列を仮定してます

方針は 行はシンプルでmap trickを使ってsumする。最後にcollect が必要です

列sumはtransposeseしてからsumする

本格的にnumpy的なことをしたいならndarray的なのを使おう

use rayon::prelude::*;

pub fn transpose<T: Send + Sync + Copy  >(v: &Vec<Vec<T>>) -> Vec<Vec<T>> {
    assert!(!v.is_empty());
    let len = v[0].len();
    (0..len).into_par_iter()
        .map(|i| v.iter().map(|row| row[i]).collect())
        .collect()
}


fn main() {
    let v = vec![vec![1, 2,3], vec![3, 4,6]];
    let vt  = transpose(&v);
    println!("{:?}",v);
    let vs:Vec<i32> = v.iter().map(|row| row.iter().sum() ).collect();
    println!("{:?}",vs);
    println!("{:?}",vt);
    let vt_s:Vec<i32>  = vt.iter().map(|row| row.iter().sum() ).collect();
    
    println!("{:?}",vt_s);
}