ndarray::Array任意维度索引失败,求可行解决方案
解决ndarray中const泛型维度下的数组索引问题
问题原因
ndarray的NdIndex trait对固定大小数组的实现是针对具体维度数(如[usize;1]、[usize;2])生成的,而非泛型的[usize; D]。当使用const泛型参数D时,编译器无法为任意D自动推导对应的NdIndex实现,因此出现约束未满足的编译错误。
解决方法
将[usize; D]类型的索引转换为ndarray::Dim<[Ix; D]>类型即可,因为Dim类型自身实现了NdIndex trait,可直接用于索引数组。
修改后的代码示例
use ndarray::{Array, Dim, Ix}; struct Model<const D: usize> { b: f64, j: f64, arr: Array<f64, Dim<[Ix, D]>>, } impl<const D: usize> Model<D> { fn sum(&self) -> f64 { let mut sum = 0.0; let cursor = [0; D]; // 将[usize; D]转换为Dim类型后执行索引 sum += self.arr[Dim::from(cursor)]; sum } }
替代方案:使用get方法安全索引
如果需要处理索引越界的情况,可以使用get方法,它接受[usize; D]作为参数并返回Option<&f64>:
impl<const D: usize> Model<D> { fn sum(&self) -> f64 { let mut sum = 0.0; let cursor = [0; D]; // 安全获取元素,越界时返回0.0 sum += self.arr.get(cursor).unwrap_or(&0.0); sum } }
内容的提问来源于stack exchange,提问作者xis
相关产品推荐
相关产品推荐

