59 where SM: Storage<E,N,M>, SV: Storage<E,M,K> + Clone, |
59 where SM: Storage<E,N,M>, SV: Storage<E,M,K> + Clone, |
60 N : Dim, M : Dim, K : Dim, E : Scalar + Zero + One + ClosedAddAssign + ClosedMulAssign, |
60 N : Dim, M : Dim, K : Dim, E : Scalar + Zero + One + ClosedAddAssign + ClosedMulAssign, |
61 DefaultAllocator : Allocator<N,K>, |
61 DefaultAllocator : Allocator<N,K>, |
62 DefaultAllocator : Allocator<M,K>, |
62 DefaultAllocator : Allocator<M,K>, |
63 DefaultAllocator : Allocator<N,M>, |
63 DefaultAllocator : Allocator<N,M>, |
64 DefaultAllocator : Allocator<M,N> { |
64 DefaultAllocator : Allocator<M,N> |
65 } |
65 { |
66 |
66 type LinCodomain = OMatrix<E,N,K>; |
67 impl<SM,SV1,SV2,N,M,K,E> GEMV<E, Matrix<E,M,K,SV1>, Matrix<E,N,K,SV2>> for Matrix<E,N,M,SM> |
67 } |
68 where SM: Storage<E,N,M>, SV1: Storage<E,M,K> + Clone, SV2: StorageMut<E,N,K>, |
68 |
|
69 impl<SM,SV1,N,M,K,E> GEMV<Matrix<E,M,K,SV1>> for Matrix<E,N,M,SM> |
|
70 where SM: Storage<E,N,M>, SV1: Storage<E,M,K> + Clone, |
69 N : Dim, M : Dim, K : Dim, E : Scalar + Zero + One + Float, |
71 N : Dim, M : Dim, K : Dim, E : Scalar + Zero + One + Float, |
70 DefaultAllocator : Allocator<N,K>, |
72 DefaultAllocator : Allocator<N,K>, |
71 DefaultAllocator : Allocator<M,K>, |
73 DefaultAllocator : Allocator<M,K>, |
72 DefaultAllocator : Allocator<N,M>, |
74 DefaultAllocator : Allocator<N,M>, |
73 DefaultAllocator : Allocator<M,N> { |
75 DefaultAllocator : Allocator<M,N> { |
83 fn apply_mut<'a, I : Instance<Matrix<E,M,K,SV1>>>(&self, y : &mut Matrix<E,N,K,SV2>, x : I) { |
85 fn apply_mut<'a, I : Instance<Matrix<E,M,K,SV1>>>(&self, y : &mut Matrix<E,N,K,SV2>, x : I) { |
84 x.eval(|x̃| self.mul_to(x̃, y)) |
86 x.eval(|x̃| self.mul_to(x̃, y)) |
85 } |
87 } |
86 } |
88 } |
87 |
89 |
88 impl<SM,SV1,M,E> AXPY<E, Vector<E,M,SV1>> for Vector<E,M,SM> |
90 impl<SM,M,E> AXPY for Vector<E,M,SM> |
89 where SM: StorageMut<E,M> + Clone, SV1: Storage<E,M> + Clone, |
91 where SM: StorageMut<E,M> + Clone, |
90 M : Dim, E : Scalar + Zero + One + Float, |
92 M : Dim, E : Scalar + Zero + One + Float, |
91 DefaultAllocator : Allocator<M> { |
93 DefaultAllocator : Allocator<M> { |
92 |
94 type Field = E; |
93 #[inline] |
95 |
94 fn axpy<I : Instance<Vector<E,M,SV1>>>(&mut self, α : E, x : I, β : E) { |
96 #[inline] |
|
97 fn axpy<I : Instance<Vector<E,M,SM>>>(&mut self, α : E, x : I, β : E) { |
95 x.eval(|x̃| Matrix::axpy(self, α, x̃, β)) |
98 x.eval(|x̃| Matrix::axpy(self, α, x̃, β)) |
96 } |
99 } |
97 |
100 |
98 #[inline] |
101 #[inline] |
99 fn copy_from<I : Instance<Vector<E,M,SV1>>>(&mut self, y : I) { |
102 fn copy_from<I : Instance<Vector<E,M,SM>>>(&mut self, y : I) { |
100 y.eval(|ỹ| Matrix::copy_from(self, ỹ)) |
103 y.eval(|ỹ| Matrix::copy_from(self, ỹ)) |
101 } |
104 } |
102 } |
105 } |
103 |
106 |
104 /* Implemented automatically as Euclidean. |
107 /* Implemented automatically as Euclidean. |