特性绑定不满足于从元组特性构建ndarray



我对Rust很陌生。目前,我正在寻找一种基于元组生成具有维度的矩阵的方法。

use itertools::zip;
use ndarray::Array;
fn main() {
let mut layer_width: [u64; 4] = [784, 512, 256, 10]; //in- & output layers of the nn 
init_nn(&mut layer_width);
}
fn init_nn(layer_width: &mut [u64; 4]) {
for (layer_in, layer_out) in zip(&layer_width[.. 4], &layer_width[1 ..]) {
let mut params = Array::zeros((layer_in, layer_out));  //error  
}
}

zip的迭代工作得很好,我得到了layer_in和_out的输出,但在创建矩阵时,我得到以下错误:

the trait bound `(&i64, &i64): ndarray::Dimension` is not satisfied
the trait `ndarray::Dimension` is not implemented for `(&i64, &i64)`
note: required because of the requirements on the impl of `ndarray::IntoDimension` for `(&i64, &i64)`rustc(E0277)
main.rs(13, 39): the trait `ndarray::Dimension` is not implemented for `(&i64, &i64)`

在这个问题上,我非常需要社会的帮助。非常感谢。

问题是您将(&i64, &i64)传递给Array::zeros(),这是无效的。相反,您可以传入(usize, usize)。修复后,代码仍然不会编译,因为我们还没有给编译器任何了解元素类型的方法,但一旦您对数组执行赋值之类的操作,错误就会自行解决。

这是工作代码:

use itertools::zip;
use ndarray::Array;
fn main() {
let mut layer_width: [usize; 4] = [784, 512, 256, 10]; // in- & output layers of the nn
init_nn(&mut layer_width);
}
fn init_nn(layer_width: &mut [usize; 4]) {
for (&layer_in, &layer_out) in zip(&layer_width[..4], &layer_width[1..]) {
let mut params = Array::zeros((layer_in, layer_out));

// Dummy assignment so the compiler can infer the element type
params[(0, 0)] = 1;
}
}

请注意for (&layer_in, &layer_out)中添加的&zip()函数的输出是(&usize, &usize),所以我们使用析构函数将引用解引用为普通的usizes。等效地,您可以执行Array::zeros((*layer_in, *layer_out))

最新更新