Rust 如何限制激活栏,以便对<;类型使用exp()函数;T>;?

Rust 如何限制激活栏,以便对<;类型使用exp()函数;T>;?,rust,Rust,我正在尝试制作一个使用数字f32和f64的sigmoid函数。 此代码获取错误-在当前范围中找不到类型&T的名为exp的方法。 我想我知道为什么会发生这种情况,我想向编译器解释数字将是F32和F64,但我不知道如何。对不起我的英语 pub trait Activation<T> { fn compute(&self,input:&Vec<T>) -> Vec<T>; } pub struct Sigmoid {} impl Si

我正在尝试制作一个使用数字f32和f64的sigmoid函数。 此代码获取错误-在当前范围中找不到类型
&T
的名为
exp
的方法。 我想我知道为什么会发生这种情况,我想向编译器解释数字将是F32和F64,但我不知道如何。对不起我的英语

pub trait Activation<T> {
  fn compute(&self,input:&Vec<T>) -> Vec<T>;
}

pub struct Sigmoid {}
  impl Sigmoid {
    pub fn new() -> Sigmoid {
      Sigmoid{}
    }
  }

  impl<T> Activation<T> for Sigmoid {
  fn compute(&self, input: &Vec<T>) -> Vec<> {
    let mut out:Vec<T> = vec![];
      for (i,v) in input.iter().enumerate() {
        let mut z =  *v.exp() ;
        out.push(z);
      }
    out
  }
}
pub特征激活{
fn compute(&self,输入:&Vec)->Vec;
}
发布结构Sigmoid{}
内乙状结肠{
pub fn new()->Sigmoid{
乙状结肠{}
}
}
乙状结肠的impl激活{
fn计算(&self,输入:&Vec)->Vec{
放出mut:Vec=Vec![];
对于input.iter().enumerate()中的(i,v){
设mut z=*v.exp();
向外推(z);
}
出来
}
}

看起来您可以使用num_traits板条箱:

use num_traits::float::Float;

pub trait Activation<T: Float> {
    fn compute(&self, input: &Vec<T>) -> Vec<T>;
}

pub struct Sigmoid {}
impl Sigmoid {
    pub fn new() -> Sigmoid {
        Sigmoid {}
    }
}

impl<T> Activation<T> for Sigmoid
    where T: Float {

    fn compute(&self, input: &Vec<T>) -> Vec<T> {
        let mut out: Vec<T> = vec![];
        for (_, v) in input.iter().enumerate() {
            let z = v.exp();
            out.push(z);
        }

        out
    }
}
使用num\u traits::float::float;
pub特征激活{
fn compute(&self,输入:&Vec)->Vec;
}
发布结构Sigmoid{}
内乙状结肠{
pub fn new()->Sigmoid{
乙状结肠{}
}
}
乙状结肠的impl激活
其中T:浮动{
fn计算(&self,输入:&Vec)->Vec{
放出mut:Vec=Vec![];
对于input.iter().enumerate()中的(u,v){
设z=v.exp();
向外推(z);
}
出来
}
}
您也可以在不使用num板条箱的情况下实现此功能,但它有点难看:

pub trait LocalFloat {
    fn exp(self) -> Self;
}

impl LocalFloat for f32 {
    fn exp(self) -> Self {
        f32::exp(self)
    }
}

impl LocalFloat for f64 {
    fn exp(self) -> Self {
        f64::exp(self)
    }
}

pub trait Activation<T: LocalFloat> {
    fn compute(&self, input: &Vec<T>) -> Vec<T>;
}

pub struct Sigmoid {}
impl Sigmoid {
    pub fn new() -> Sigmoid {
        Sigmoid {}
    }
}

impl<T> Activation<T> for Sigmoid
    where T: LocalFloat + Copy {

    fn compute(&self, input: &Vec<T>) -> Vec<T> {
        let mut out: Vec<T> = vec![];
        for (_, v) in input.iter().enumerate() {
            let z = v.exp();
            out.push(z);
        }

        out
    }
}
LocalFloat{
fn exp(self)->self;
}
f32的impl LocalFloat{
fn exp(self)->self{
f32::exp(self)
}
}
f64的impl LocalFloat{
fn exp(self)->self{
f64::exp(自我)
}
}
pub特征激活{
fn compute(&self,输入:&Vec)->Vec;
}
发布结构Sigmoid{}
内乙状结肠{
pub fn new()->Sigmoid{
乙状结肠{}
}
}
乙状结肠的impl激活
其中T:LocalFloat+Copy{
fn计算(&self,输入:&Vec)->Vec{
放出mut:Vec=Vec![];
对于input.iter().enumerate()中的(u,v){
设z=v.exp();
向外推(z);
}
出来
}
}