【问题标题】:How can I concisely define multidimensional `Vec`s in Rust?如何在 Rust 中简洁地定义多维 `Vec`s?
【发布时间】:2022-10-06 17:25:47
【问题描述】:

在 Rust 中初始化多维 Vec 时,我可以像这样使用 vec!-macro:

vec![vec![0; 100]; 200]

但是,对于更高维度的Vecs,这会变得很混乱。目前,我正在使用这个:

vec![vec![vec![vec![vec![vec![vec![vec![0; N-1]; N-1]; N-1]; N-1]; 2]; 2]; 2]; 2]

这不是很简洁,而且维度的写入顺序与索引顺序相反。有没有更简洁的方法来做到这一点?我正在寻找类似的东西

vec![0; 2, 2, 2, 2, N-1, N-1, N-1, N-1]
  • 您是否尝试在 crates.io 上寻找可以处理多维数组的 crate?
  • 有箱子ndarray,否则我相信宏是避免vec! 的长链的唯一方法
  • 我会推荐 ndarray 而不是 vecs 的 vecs,不仅是为了易于使用,而且 vecs 使用单独的分配并且会导致内存碎片。而 ndarray 会将所有数据存储在单个缓冲区中,它使用更少的内存并且访问效率更高。
  • @PeterHall @Ismail Maj @kmdreko 我现在尝试使用 ndarray 板条箱,但在文档中找不到如何构造 8 维 Array。有一些较低维度的示例(例如Array::zeros((2, 2))),但这似乎仅适用于最多 6 个维度。

标签: vector rust


【解决方案1】:

ndarray crate 允许您拥有一个 N 维数组。对于 6 维以上的任何内容,您可以使用 ArrayD 类型。您可以使用IxDyn - documentation with examples 创建动态维度。

7D 数组初始化和元素访问的示例:

    let mut array_7d = ArrayD::<f64>::zeros(IxDyn(&[7, 7, 7, 7, 7, 7, 7, 7]));
    let index = IxDyn(&[0, 0, 0, 0, 0, 0, 0, 0]);
    array_7d[&index] = 1.0;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 2014-12-23
    • 1970-01-01
    相关资源
    最近更新 更多