1

我觉得这段代码应该可以工作:

use ndarray::{Array1, s}; // 0.15.4

fn main() {
    let x = Array1::<f64>::range(0.0, 10.0, 1.0);
    println!("{:?}", x);
    println!("{:?}", x.slice(s![1..]));
    println!("{:?}", x.slice(s![..-1]));
    println!("{:?}", x.slice(s![1..]) - x.slice(s![..-1])); // fails to compile when this line is uncommented
}

如果我评论最后的印刷品,前 3 行印刷品确实有效。我在这里错过了什么吗?
Rust Playground 实现

4

1 回答 1

2

文档解释说:

令 A 为任何类型的数组或视图。令 B 为具有自有存储的数组(Array 或 ArcArray)。令 C 为具有可变数据的数组(Array、ArcArray 或 ArrayViewMut)。对于用@ 表示的任意二元运算符(可以是+、-、*、/ 等),支持以下操作数组合。

  • &A @ &A 产生一个新的数组
  • B @ A 消费 B,用结果更新它,然后返回它
  • B @ &A 消耗 B,用结果更新它,然后返回它
  • C @= &A 就地执行算术运算

还有

您可以使用切片来创建数组中数据子集的视图。切片方法包括 .slice()、.slice_mut()、.slice_move() 和 .slice_collapse()。

所以你要使用&x.slice(s![1..]) - &x.slice(s![..-1])(注意两个&)。

于 2022-03-02T18:41:32.437 回答