特质绑定不满足于从元组特质中构建一个ndarray

Trait bound not satisfied building an ndarray from a tuple trait


问题

我对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)`

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

答案1

问题是你把 (&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) ,所以我们使用解构来将引用解构为普通的 usize s。