特征绑定不满足从元组特征构建 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)`
在此问题上,我非常需要社区的帮助。非常感谢。
问题是您将 (&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。同样,您可以完成 Array::zeros((*layer_in, *layer_out))
.
我对 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)
,因此我们使用解构将引用解引用为普通的 usize
s。同样,您可以完成 Array::zeros((*layer_in, *layer_out))
.