src/measures/discrete.rs

changeset 4
5aa5c279e341
parent 0
eb3c7813b67a
--- 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]

mercurial