multidimensional-array - ndarray - 尝试使用 impl AddAssign对于 ArrayBase 导致编译器错误
问题描述
我正在使用 ndarray crate (version 0.13.1
) 进行向量和矩阵运算,我遇到了一个错误,我想找到一个解释(和解决方案)。
记下这段代码:
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; // <- Compiler error
}
我假设此代码可以正确编译和运行,就像AddAssign<ndarray::ArrayBase
为ndarray::ArrayBase
(请参阅文档)实现的那样,并且形状匹配。正确的...?
不。
我在同一行(第三行)出现两个编译器错误(见问题底部)。
我对这些错误的谦虚解释是编译器似乎没有注意到AddAssign<BaseArray>
实现BaseArray
- 它只考虑了AddAssign<B> where B: ScalarOperand
(当然,这里也有文档)。
我想知道我的代码是否与实现不匹配AddAssign<BaseArray>
,如果匹配 - 还有什么问题?
这也让我很感兴趣,编译器期望f64
作为+=
操作的 rhs - 什么可能导致它完全忽略BaseArray
在这个位置确实预期的事实?
任何帮助将不胜感激。提前致谢!
错误:
error[E0271]: type mismatch resolving `<ndarray::data_repr::OwnedRepr<f64> as ndarray::data_traits::RawData>::Elem == ndarray::ArrayBase<ndarray::data_repr::OwnedRepr<f64>, ndarray::dimension::dim::Dim<[usize; 2]>>`
--> src\main.rs:11:12
|
11 | matrix += additional;
| ^^ expected `f64`, found struct `ndarray::ArrayBase`
|
= note: expected type `f64`
found struct `ndarray::ArrayBase<ndarray::data_repr::OwnedRepr<f64>, ndarray::dimension::dim::Dim<[usize; 2]>>`
= note: required because of the requirements on the impl of `std::ops::AddAssign` for `ndarray::ArrayBase<ndarray::data_repr::OwnedRepr<f64>, ndarray::dimension::dim::Dim<[usize; 2]>>`
error[E0277]: the trait bound `ndarray::ArrayBase<ndarray::data_repr::OwnedRepr<f64>, ndarray::dimension::dim::Dim<[usize; 2]>>: ndarray::impl_ops::ScalarOperand` is not satisfied
--> src\main.rs:11:12
|
11 | matrix += additional;
| ^^ the trait `ndarray::impl_ops::ScalarOperand` is not implemented for `ndarray::ArrayBase<ndarray::data_repr::OwnedRepr<f64>, ndarray::dimension::dim::Dim<[usize; 2]>>`
|
= note: required because of the requirements on the impl of `std::ops::AddAssign` for `ndarray::ArrayBase<ndarray::data_repr::OwnedRepr<f64>, ndarray::dimension::dim::Dim<[usize; 2]>>`
error: aborting due to 2 previous errors
Some errors have detailed explanations: E0271, E0277.
For more information about an error, try `rustc --explain E0271`.
解决方案
没有实现AddAssign<ArrayBase>
for ArrayBase
(为简洁起见省略了类型参数)。但是有 一个实现AddAssign<&ArrayBase>
。
自动取消引用规则有时会让您感觉可以互换使用引用或值,但这种机制不会扩展到 trait 实现或类型参数,因此您需要在这里更加明确。
您可以通过引用传递来修复您的代码:
matrix += &additional;
错误消息是正确的,但通过谈论AddAssign<f64>
. 如果编译器团队可以找到改进它的方法,则可能值得在此示例中记录问题。
推荐阅读
- python - Pandas:在添加新行时,它会替换我现有的数据框值吗?
- javascript - ESLint 没有找到 React Native 组件
- python - 结合具有不同索引的两个系列并仅保留交集
- hibernate - 如何在休眠限制中检查 sysdate - 1
- flutter - 固定行数,芯片水平滚动
- sql - 将计数器参数传递给 postgres sql 脚本
- sql-server-2016 - 如何/我可以在连接字符串中指定 SQL Server Native Client OLE DB (SQLNCLI) 的版本
- android - 在通知中将播放按钮更改为暂停按钮
- parameter-passing - V10 将 One2Many 值传递给瞬态模型 One2Many(来自 onchange 的 TypeError 和默认的 DataError)
- c# - C#-Selenium - Windows 文件上传窗口冻结