gpt4 book ai didi

vector - 获取存储在 n 维向量中的元素数

转载 作者:行者123 更新时间:2023-11-29 07:49:28 25 4
gpt4 key购买 nike

我有一个二维向量:

let vec2d = vec![
vec![1, 1, 1],
vec![1, 1, 1],
];

我可以生成以这种方式存储的元素总数:

let mut n_vec_element: i32 = 0;

for i in vec2d.iter() {
n_vec_element += i.len() as i32;
}

println!("2D vector elements :{}", n_vec_element); // prints 6

当我增加维度时,循环会变长:

let mut n_vec_element: i32 = 0;

let vec3d = vec![
vec![
vec![1, 3, 5 as i32],
vec![2, 4, 6 as i32],
vec![3, 5, 7 as i32],
],
vec![
vec![1, 3, 5 as i32],
vec![2, 4, 6 as i32],
vec![3, 5, 7 as i32],
]
];

for i in vec3d.iter() {

// I must add another iter everytime I increment the dimension by 1.
// Else, it returns the number of stored vector instead of the vector
// elements.

for j in i.iter() {
n_vec_size += j.len() as i32;
}
};

println!("3D vector elements :{}", n_vec_element); // prints 18

一定有更简洁的方法来做到这一点,但我还没有想出来。最初,我尝试使用矢量的 len() 函数,但正如我上面所说,它返回存储的矢量数量而不是其元素。

最佳答案

您不需要显式循环来执行此操作:

let vec2d = vec![
vec![1, 1, 1],
vec![1, 1, 1],
];

let n_vec_element: usize = vec2d.iter().map(Vec::len).sum();

assert_eq!(n_vec_element, 6);

对于 3d 矢量,你可以这样做:

let vec3d = vec![
vec![
vec![1, 3, 5 as i32],
vec![2, 4, 6 as i32],
vec![3, 5, 7 as i32],
],
vec![
vec![1, 3, 5 as i32],
vec![2, 4, 6 as i32],
vec![3, 5, 7 as i32],
]
];

let n_vec_element: usize = vec3d.iter().flatten().map(Vec::len).sum();

assert_eq!(n_vec_element, 18);

用一个4D向量,你可以放2个flatten


使用专门化功能(,使用夜间编译器),您可以使用独特的方法对其进行概括:

#![feature(specialization)]

trait Count {
fn count(self) -> usize;
}

impl<T> Count for T {
default fn count(self) -> usize {
1
}
}

impl<T> Count for T
where
T: IntoIterator,
T::Item: Count,
{
fn count(self) -> usize {
self.into_iter().map(|x| x.count()).sum()
}
}

fn main() {
let v = vec![1, 2, 3];
assert_eq!(v.count(), 3);

let v = vec![vec![1, 2, 3], vec![4, 5, 6]];
assert_eq!(v.count(), 6);
}

关于vector - 获取存储在 n 维向量中的元素数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52042045/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com