--- a/src/measures/discrete.rs Thu Dec 01 23:07:35 2022 +0200 +++ b/src/measures/discrete.rs Sun Sep 25 21:45:56 2022 +0300 @@ -7,7 +7,14 @@ }; use std::iter::Sum; use serde::ser::{Serializer, Serialize, SerializeSeq}; -use nalgebra::DVector; +use nalgebra::{ + DVector, + DVectorSliceMut, + Dynamic, + Const, + SliceStorageMut, + Matrix, +}; use alg_tools::norms::Norm; use alg_tools::tabledump::TableDump; @@ -176,6 +183,25 @@ } } +impl<Domain, F : Float + ToNalgebraRealField<MixedType=F>> DiscreteMeasure<Domain, F> { + pub fn masses_mut(&mut self) -> DVectorSliceMut<'_, F::MixedType, Dynamic> { + let n = self.spikes.len(); + unsafe { + let start = self.spikes.as_mut_ptr(); + let next = start.add(1); + let ptr = &mut (*start).α as *mut F; + let ptrnext = &mut (*next).α as *mut F; + let stride = ptrnext.offset_from(ptr); + assert_eq!(start.add(stride as usize), next); + Matrix::from_data(SliceStorageMut::from_raw_parts( + ptr, + (Dynamic::new(n), Const), + (Dynamic::new(stride as usize), Dynamic::new(0)) + )) + } + } +} + impl<Domain, F :Num> Index<usize> for DiscreteMeasure<Domain, F> { type Output = DeltaMeasure<Domain, F>; #[inline]