Rust 如何限制激活栏,以便对<;类型使用exp()函数;T>;?
我正在尝试制作一个使用数字f32和f64的sigmoid函数。 此代码获取错误-在当前范围中找不到类型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
&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);
}
出来
}
}