gpt4 book ai didi

struct - 为具有多个参数的矩阵实现索引运算符

转载 作者:行者123 更新时间:2023-11-29 08:02:12 24 4
gpt4 key购买 nike

我正在尝试创建一个 Matrix 结构,我想重写 Index 运算符,让我拥有矩阵式索引。

例如:

let m = Matrix { ... DATA ... }
let entry = m[0,0]

我的结构是这样的:

struct Matrix {
cols: usize,
rows: usize,
data: Vec<f32>
}

我一直在查看 Index trait而且我不明白我怎么能做到这一点?此外,我希望能够在每个维度等中获取范围。

最佳答案

简而言之,您不能这样做。 Index trait定义为:

pub trait Index<Idx: ?Sized> {
type Output: ?Sized;
fn index(&self, index: Idx) -> &Self::Output;
}

也就是说,它需要一个类型为 Idx单个 参数。最接近的做法是使用元组,它是一个包含多个值的单一类型:

impl std::ops::Index<(usize, usize)> for Matrix {
type Output = f32;

fn index(&self, idx: (usize, usize)) -> &f32 {
// or as appropriate for row- or column-major data
&self.data[idx.0 * self.cols + idx.1]
}
}

它会被称为

matrix[(0, 1)]

bluss points outmultiarray crate使用二元数组而不是元组。这可能更容易输入,因为您只需敲击方括号两次:

impl std::ops::Index<[usize; 2]> for Matrix {
type Output = f32;

fn index(&self, idx: [usize; 2]) -> &f32 {
// or as appropriate for row- or column-major data
&self.data[idx[0] * self.cols + idx[1]]
}
}

它的名称类似于 matrix[[0, 1]]。重要的是仍然只有一个值作为参数提供给 index

根据需要为 Range 重复实现, RangeTo , RangeFrom , 和 RangeFull .这些都是单一类型,因此您可以将其称为 matrix[5..],无论这意味着什么。

关于struct - 为具有多个参数的矩阵实现索引运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33770989/

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