首页 > 解决方案 > 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::ArrayBasendarray::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`.

标签: multidimensional-arrayrusttraits

解决方案


没有实现AddAssign<ArrayBase>for ArrayBase(为简洁起见省略了类型参数)。但是 一个实现AddAssign<&ArrayBase>

自动取消引用规则有时会让您感觉可以互换使用引用或值,但这种机制不会扩展到 trait 实现或类型参数,因此您需要在这里更加明确。

您可以通过引用传递来修复您的代码:

matrix += &additional;

错误消息是正确的,但通过谈论AddAssign<f64>. 如果编译器团队可以找到改进它的方法,则可能值得在此示例中记录问题。


推荐阅读