use crate::tensor::*;
impl<T> Tensor<T>
where
T: Default + std::ops::Sub<Output = T> + Copy,
{
pub fn tens_sub(&self, tens2: &Tensor<T>) -> Option<Tensor<T>>{
if self.get_shape() != tens2.get_shape(){
return None;
}
let mut return_data = Vec::with_capacity(self.get_data().len());
for i in 0..self.get_data().len(){
return_data.push(self.get_data()[i] - tens2.get_data()[i]);
}
Tensor::from_data(&return_data, self.get_shape())
}
pub fn tens_sub_mut(&mut self, tens2: &Tensor<T>){
if self.get_shape() != tens2.get_shape(){
return;
}
let mut return_data = Vec::with_capacity(self.get_data().len());
for i in 0..self.get_data().len(){
return_data.push(self.get_data()[i] - tens2.get_data()[i]);
}
self.set_data(&return_data);
}
pub fn sub(&self, val: T) -> Tensor<T>{
let mut return_data = Vec::with_capacity(self.get_data().len());
for i in 0..self.get_data().len(){
return_data.push(self.get_data()[i] - val);
}
Tensor::from_data(&return_data, self.get_shape()).unwrap()
}
pub fn sub_mut(&mut self, val: T){
let mut return_data = Vec::with_capacity(self.get_data().len());
for i in 0..self.get_data().len(){
return_data.push(self.get_data()[i] - val);
}
self.set_data(&return_data);
}
}