Rust通过tuple构建ndarray时提示Trait bound not satisfied错误怎么解决
问题原因
遍历数组切片得到的layer_in、layer_out均为&u64引用类型,而ndarray::Array::zeros接收的维度参数需要实现IntoDimension特征,引用组成的元组没有对应实现,只有值类型的整数元组符合要求。另外ndarray的维度默认要求usize类型,直接传u64也会触发类型不匹配问题。
修复方案
有两种常用修改方式,二选一即可:
- 方式一:构造维度时直接解引用并转类型
将报错行修改为:let mut params = Array::zeros((*layer_in as usize, *layer_out as usize)); - 方式二:遍历解构时直接取出值
将for循环行修改为:
后续构造数组时直接转类型即可:for (&layer_in, &layer_out) in zip(&layer_width[.. 4], &layer_width[1 ..]) {let mut params = Array::zeros((layer_in as usize, layer_out as usize));
完整可运行代码
use itertools::zip; use ndarray::Array; fn main() { let layer_width: [u64; 4] = [784, 512, 256, 10]; // 神经网络的输入输出层维度 init_nn(&layer_width); } fn init_nn(layer_width: &[u64; 4]) { for (&layer_in, &layer_out) in zip(&layer_width[..4], &layer_width[1..]) { let mut params = Array::zeros((layer_in as usize, layer_out as usize)); println!("成功创建{}x{}维度的参数矩阵", layer_in, layer_out); } }
补充说明
如果不需要修改layer_width数组的内容,可以去掉参数的mut修饰,减少不必要的可变性声明。
内容的提问来源于stack exchange,提问作者Denny Rommel
相关产品推荐
相关产品推荐

