src/measures/discrete.rs

changeset 4
5aa5c279e341
parent 0
eb3c7813b67a
equal deleted inserted replaced
0:eb3c7813b67a 4:5aa5c279e341
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)

mercurial