首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >未为f64实现RawData

未为f64实现RawData
EN

Stack Overflow用户
提问于 2020-11-11 01:55:52
回答 1查看 50关注 0票数 0

我正在尝试使用ndarray来计算点积,但得到了一些我不理解的编译错误。

我的基本功能是

代码语言:javascript
运行
复制
use ndarray::{ArrayD, ArrayBase};

pub fn cosine<L>(v1: &ArrayBase<f64, L>, v2: &ArrayBase<f64, L>) -> f64 {
    let x: f64 = v1.dot(&v2) / (v1.dot(v1) * v2.dot(v2)).sqrt();
    return x
}

pub fn cosine2(v1: &ArrayD<f64>, v2: &ArrayD<f64>) -> f64 {
    let x: f64 = v1.dot(v2) / (v1.dot(v1) * v2.dot(v2)).sqrt();
    return x
}

编译失败:

代码语言:javascript
运行
复制
error[E0277]: the trait bound `f64: ndarray::data_traits::RawData` is not satisfiedchgraph                  
 --> src/simple.rs:3:1
  |
3 | / pub fn cosine<L>(v1: &ArrayBase<f64, L>, v2: &ArrayBase<f64, L>) -> f64 {
4 | |     let x: f64 = v1.dot(&v2) / (v1.dot(v1) * v2.dot(v2)).sqrt();
5 | | }
  | |_^ the trait `ndarray::data_traits::RawData` is not implemented for `f64`
  |
  = note: required by `ndarray::ArrayBase`

如果我注释掉了cosine,就会收到来自cosine2的错误

代码语言:javascript
运行
复制
error[E0599]: no method named `dot` found for reference `&ndarray::ArrayBase<ndarray::data_repr::OwnedRepr<f64>, ndarray::dimension::dim::Dim<ndarray::dimension::dynindeximpl::IxDynImpl>>` in the current scope
 --> src/simple.rs:9:21
  |
9 |     let x: f64 = v1.dot(v2) / (v1.dot(v1) * v2.dot(v2)).sqrt();
  |                     ^^^ method not found in `&ndarray::ArrayBase<ndarray::data_repr::OwnedRepr<f64>, ndarray::dimension::dim::Dim<ndarray::dimension::dynindeximpl::IxDynImpl>>`

(对于其他点积,再复制两份)。为什么第二个版本找不到这个方法?看起来ArrayD是一种基于Array的类型,而ArrayBase又是一种类型,所以ArrayD::dot应该是一个现有的方法。

我只需要通过一个ArrayD,所以我对这两个版本都很满意。

我的Cargo.toml的相关部分是

代码语言:javascript
运行
复制
[dependencies.ndarray]
version = "0.13.1"

[features]
default = ["ndarray/blas"]
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-11 02:06:24

首先,ArrayBase的数据类型不是通过数据类型来索引的,而是该数据类型的RawData包装器。其次,dot需要实现Dot特征。因此,您应该将这两者都添加到特征边界中:

代码语言:javascript
运行
复制
use ndarray::linalg::Dot;
use ndarray::{ArrayBase, ArrayD, RawData};

pub fn cosine<D, L>(v1: &ArrayBase<D, L>, v2: &ArrayBase<D, L>) -> f64
where
    D: RawData<Elem = f64>,
    ArrayBase<D, L>: Dot<ArrayBase<D, L>, Output = f64>,
{
    let x: f64 = v1.dot(&v2) / (v1.dot(v1) * v2.dot(v2)).sqrt();
    return x;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64774226

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档