我正在尝试实现在 Rust 中获取矩阵列上的只读迭代器的方法(
Vec<Vec<u64>>
,不是平坦的,并且在现实世界中矩阵将以不同的方式存储,但假设如此)。
Python 中应该类似这样:
>>> m = [[1,2], [3,4]]
>>> list(zip(*m))
[(1, 3), (2, 4)]
我理解由于借用规则可能会很复杂。但由于一次可以有多个只读引用,这似乎是可能的。
这在 Rust 中并不太复杂。
pub fn column_iterator<T>(v: &[Vec<T>]) -> impl Iterator<Item = &T> {
let width = v.first().map(|f| f.len()).unwrap_or(0);
(0..width).flat_map(|y| v.iter().map(move |row| &row[y]))
}
对于更复杂的矩阵运算,请考虑使用 ndarray,它有一个
columns
方法。
use ndarray::{ArrayBase, Data, Ix2};
pub fn column_iterator<'a, T>(
v: &'a ArrayBase<impl Data<Elem = T>, Ix2>,
) -> impl Iterator<Item = &'a T>
where
T: 'a,
{
v.columns().into_iter().flatten()
}