5 Add,Sub,AddAssign,SubAssign, |
5 Add,Sub,AddAssign,SubAssign, |
6 Index,IndexMut, |
6 Index,IndexMut, |
7 }; |
7 }; |
8 use std::iter::Sum; |
8 use std::iter::Sum; |
9 use serde::ser::{Serializer, Serialize, SerializeSeq}; |
9 use serde::ser::{Serializer, Serialize, SerializeSeq}; |
10 use nalgebra::DVector; |
10 use nalgebra::{ |
|
11 DVector, |
|
12 DVectorSliceMut, |
|
13 Dynamic, |
|
14 Const, |
|
15 SliceStorageMut, |
|
16 Matrix, |
|
17 }; |
11 |
18 |
12 use alg_tools::norms::Norm; |
19 use alg_tools::norms::Norm; |
13 use alg_tools::tabledump::TableDump; |
20 use alg_tools::tabledump::TableDump; |
14 use alg_tools::linops::{Apply, Linear}; |
21 use alg_tools::linops::{Apply, Linear}; |
15 use alg_tools::iter::{MapF,Mappable}; |
22 use alg_tools::iter::{MapF,Mappable}; |
174 pub fn set_masses_dvector(&mut self, x : &DVector<F::MixedType>) { |
181 pub fn set_masses_dvector(&mut self, x : &DVector<F::MixedType>) { |
175 self.set_masses(x.iter().map(|&α| F::from_nalgebra_mixed(α))); |
182 self.set_masses(x.iter().map(|&α| F::from_nalgebra_mixed(α))); |
176 } |
183 } |
177 } |
184 } |
178 |
185 |
|
186 impl<Domain, F : Float + ToNalgebraRealField<MixedType=F>> DiscreteMeasure<Domain, F> { |
|
187 pub fn masses_mut(&mut self) -> DVectorSliceMut<'_, F::MixedType, Dynamic> { |
|
188 let n = self.spikes.len(); |
|
189 unsafe { |
|
190 let start = self.spikes.as_mut_ptr(); |
|
191 let next = start.add(1); |
|
192 let ptr = &mut (*start).α as *mut F; |
|
193 let ptrnext = &mut (*next).α as *mut F; |
|
194 let stride = ptrnext.offset_from(ptr); |
|
195 assert_eq!(start.add(stride as usize), next); |
|
196 Matrix::from_data(SliceStorageMut::from_raw_parts( |
|
197 ptr, |
|
198 (Dynamic::new(n), Const), |
|
199 (Dynamic::new(stride as usize), Dynamic::new(0)) |
|
200 )) |
|
201 } |
|
202 } |
|
203 } |
|
204 |
179 impl<Domain, F :Num> Index<usize> for DiscreteMeasure<Domain, F> { |
205 impl<Domain, F :Num> Index<usize> for DiscreteMeasure<Domain, F> { |
180 type Output = DeltaMeasure<Domain, F>; |
206 type Output = DeltaMeasure<Domain, F>; |
181 #[inline] |
207 #[inline] |
182 fn index(&self, i : usize) -> &Self::Output { |
208 fn index(&self, i : usize) -> &Self::Output { |
183 self.spikes.index(i) |
209 self.spikes.index(i) |