diff --git a/examples/convolution.rs b/examples/convolution.rs index c3c61eca..7a3e8780 100644 --- a/examples/convolution.rs +++ b/examples/convolution.rs @@ -1,9 +1,8 @@ extern crate nalgebra as na; use na::storage::Storage; -#[allow(unused_imports)] use na::{ - DMatrix, DVector, Dim, Dynamic, Matrix, Matrix2x3, Real, VecStorage, Vector, Vector2, Vector3, - Vector4, U1, + convert, zero, DMatrix, DVector, Dim, Dynamic, Matrix, Matrix2x3, Real, VecStorage, Vector, + Vector2, Vector3, Vector4, Vector5, U1, }; use std::cmp; @@ -24,7 +23,7 @@ fn convolve_full, Q: Storage>( let mut conv = DVector::::zeros(newlen); for i in 0..newlen { - let u_i = if i > ker {i - ker} else {0}; + let u_i = if i > ker { i - ker } else { 0 }; let u_f = cmp::min(i, vec - 1); if u_i == u_f { @@ -47,6 +46,7 @@ fn convolve_valid, Q: Storage>( let vec = vector.len(); let ker = kernel.len(); let newlen = vec - ker + 1; + let mut conv = DVector::::zeros(newlen); for i in 0..newlen { @@ -63,23 +63,18 @@ fn convolve_same, Q: Storage>( ) -> Matrix> { let vec = vector.len(); let ker = kernel.len(); - let newlen = vec + ker - 1; - let mut conv = DVector::::zeros(newlen); + let mut conv = DVector::::zeros(vec); - for i in 0..newlen { - // let u_i = cmp::max(0, i - k); - // let u_f = cmp::min(i, v - 1); - - // if u_i == u_f { - // conv[i as usize] += vector[u_i as usize] * kernel[(i - u_i) as usize]; - // } else { - // for u in u_i..(u_f + 1) { - // if i - u < k { - // conv[i as usize] += vector[u as usize] * kernel[(i - u) as usize]; - // } - // } - // } + for i in 0..vec { + for j in 0..ker { + let val = if i + j < 1 || i + j >= vec + 1 { + zero::() + } else { + vector[i + j - 1] + }; + conv[i] += val * kernel[ker - j - 1]; + } } conv } @@ -89,10 +84,6 @@ fn convolve, Q: Storage>( kernel: Vector, mode: Option, ) -> Matrix> { - // - // vector is the vector, Kervel is the kervel - // C is the returv vector - // if kernel.len() > vector.len() { return convolve(kernel, vector, mode); } @@ -105,28 +96,8 @@ fn convolve, Q: Storage>( } fn main() { - let v1 = Vector2::new(3.0,1.0); - let v2 = Vector4::new(1.0,2.0,5.0,9.0); - let x = convolve(v1,v2,Some(ConvolveMode::Valid)); - println!("{:?}",x) - - // let m = Matrix2x3::from_anti_diagonal_element(5.0); - // The two additional arguments represent the matrix dimensions. - // let dm = DMatrix::from_anti_diagonal_element(2, 3, 5.0); - let mut m = Matrix2x3::new(1.1, 1.2, 1.3, - 2.1, 2.2, 2.3); - - // assert!(m.m11 == 0.0 && m.m12 == 0.0 && m.m13 == 5.0 && - // m.m21 == 0.0 && m.m22 == 5.0 && m.m23 == 0.0); - // assert!(dm[(0, 0)] == 0.0 && dm[(0, 1)] == 0.0 && dm[(0, 2)] == 5.0 && - // dm[(1, 0)] == 0.0 && dm[(1, 1)] == 5.0 && dm[(1, 2)] == 0.0); - println!("m={:?}",m); - for i in 0..std::cmp::min(m.nrows(),m.ncols()) { - // for j in 0..3 { - println!("m({:?},{:?})={:?}",i,3-i-1,m[(i,3-i-1)]); -unsafe { println!("m({:?},{:?})={:?}",i,3-i-1,*m.get_unchecked_mut((i, 3-i-1))) } - // } - } - - + let v1 = Vector4::new(1.0, 2.0, 1.0, 0.0); + let v2 = Vector4::new(1.0, 2.0, 5.0, 9.0); + let x = convolve(v1, v2, Some(ConvolveMode::Same)); + println!("{:?}", x); }