【问题标题】:How to do dot product in Rust using ndarray?如何使用 ndarray 在 Rust 中做点积?
【发布时间】:2020-05-30 15:27:26
【问题描述】:

我有一个向量,我使用 ndarray crate 将它重新整形为二维数组。现在我想用列 vec 做一个点积。一个例子,

use ndarray::*;

pub fn main() {

    let vec1 = //Read from file
    let vec2 = //Read from file
    let mat = Array2::from_shape_vec((row, cols), vec1).unwrap();
    let final_mat = mat.dot(&vec2);
}

我得到以下错误,

the trait `ndarray::linalg::impl_linalg::Dot<std::vec::Vec<f32>>` is not implemented for 
`ndarray::ArrayBase<ndarray::data_repr::OwnedRepr<i16>, ndarray::dimension::dim::Dim<[usize; 2]>>`

【问题讨论】:

    标签: rust


    【解决方案1】:

    该错误包含您需要的所有信息:特征 Dot&lt;Vec&lt;f32&gt;&gt;(表示使用 &amp;Vec&lt;f32&gt; 类型的参数调用 .dot() 方法的能力)未针对 Array2&lt;i16&gt; 实现。

    您需要将vec2 转换为T 类型,Array2&lt;i16&gt; 实现Dot&lt;T&gt;

    根据documentation for the Dot trait

    impl<A, S, S2> Dot<ArrayBase<S2, Dim<[usize; 1]>>> for ArrayBase<S, Ix2> where
        S: Data<Elem = A>,
        S2: Data<Elem = A>,
        A: LinalgScalar, 
    

    这意味着简化了花哨的类型,这意味着Array2&lt;T&gt; 实现了Dot&lt;Array1&lt;T&gt;&gt;。这也意味着两个数组的元素类型需要相同,但目前vec1i16s组成,vec2f32s组成。

    解决方案:将vec2 转换为Array1 并制作vec1 的元素f32s。

    use ndarray::{Array1, Array2};
    
    fn main(){
        let vec1 = // read from file, converting i16s to f32s
        let vec2 = // read from file
        let mat = Array2::from_shape_vec((row, cols), vec1).unwrap();
        let col_vec = Array1::from(vec2);
        let final_mat = mat.dot(&col_vec);
    }
    

    【讨论】:

    • 非常感谢 :) 消息太大,因此我无法理解
    猜你喜欢
    • 1970-01-01
    • 2019-06-26
    • 1970-01-01
    • 2022-08-13
    • 2022-06-28
    • 1970-01-01
    • 2017-05-31
    • 1970-01-01
    • 2019-02-25
    相关资源
    最近更新 更多