gpt4 book ai didi

rust - 如何使用 ndarray 在 Rust 中做点积?

转载 作者:行者123 更新时间:2023-12-03 11:48:35 25 4
gpt4 key购买 nike

我有一个向量,我使用 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]>>`

最佳答案

该错误包含您需要的所有信息:特征 Dot<Vec<f32>> ,表示能够调用 .dot()参数类型为 &Vec<f32> 的方法, 不适用于 Array2<i16> .

您需要转换 vec2到类型 T其中Array2<i16>工具Dot<T> .

根据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<T>工具 Dot<Array1<T>> .这也意味着两个数组的元素类型需要相同,但目前 vec1i16 组成s 和 vec2f32 组成s。

解决方法:转换 vec2Array1并制作 vec1 的元素 f32 s。

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);
}

关于rust - 如何使用 ndarray 在 Rust 中做点积?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62104649/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com