使用ndarray crate 0.13.1时AddAssign<ArrayBase>引发编译错误
解决ndarray 0.13.1中数组复合赋值的编译错误
为什么会报错?
你猜的没错——编译器确实没找到数组间的AddAssign实现,问题出在ndarray 0.13.x版本里,数组与数组的复合赋值操作(比如+=)属于可选特性,默认没启用。
默认情况下,ndarray只提供了标量和数组的复合赋值实现,所以编译器会认为你想把一个f64标量加到数组上,才会抛出“期望f64,找到ArrayBase”的错误。
怎么解决?
1. 启用assign_ops特性
打开你的Cargo.toml,修改ndarray的依赖配置,加上assign_ops特性:
[dependencies] ndarray = { version = "0.13.1", features = ["assign_ops"] }
这个特性会编译进数组间的复合赋值相关trait实现,你的原代码就能正常编译了。
2. 可选优化:使用引用避免所有权转移
如果不想让additional的所有权被转移,可以把右侧改成引用,效果一样:
use ndarray as nd; fn main() { let mut matrix: nd::Array2<f64> = nd::Array::zeros((3, 4)); let additional: nd::Array2<f64> = nd::Array::ones((3, 4)); matrix += &additional; // 用引用,后续还能继续使用additional }
额外说明
ndarray 0.13.x把很多非核心功能做成了可选特性,目的是减少编译时间和最终二进制大小。除了assign_ops,如果需要并行计算可以加rayon特性,需要序列化可以加serde特性,你可以根据需求自行添加。
内容的提问来源于stack exchange,提问作者Neo
相关产品推荐
相关产品推荐

