use super::*;
use core::convert::TryFrom;
use nalgebra::Dyn;
impl<'a, T> IntoNalgebra for ndarray::ArrayView1<'a, T>
where
T: nalgebra::Scalar,
{
type Out = nalgebra::DVectorView<'a, T>;
fn into_nalgebra(self) -> Self::Out {
let len = Dyn(self.len());
let ptr = self.as_ptr();
let stride: usize = TryFrom::try_from(self.strides()[0]).expect("Negative stride");
let storage = unsafe {
nalgebra::ViewStorage::from_raw_parts(
ptr,
(len, nalgebra::Const::<1>),
(nalgebra::Const::<1>, Dyn(stride)),
)
};
nalgebra::Matrix::from_data(storage)
}
}
impl<'a, T> IntoNalgebra for ndarray::ArrayViewMut1<'a, T>
where
T: nalgebra::Scalar,
{
type Out = nalgebra::DVectorViewMut<'a, T>;
fn into_nalgebra(mut self) -> Self::Out {
let len = Dyn(self.len());
let stride: usize = TryFrom::try_from(self.strides()[0]).expect("Negative stride");
let ptr = self.as_mut_ptr();
let storage = unsafe {
nalgebra::ViewStorageMut::from_raw_parts(
ptr,
(len, nalgebra::Const::<1>),
(nalgebra::Const::<1>, Dyn(stride)),
)
};
nalgebra::Matrix::from_data(storage)
}
}
impl<T> IntoNalgebra for ndarray::Array1<T>
where
T: nalgebra::Scalar,
{
type Out = nalgebra::DVector<T>;
fn into_nalgebra(self) -> Self::Out {
let len = Dyn(self.len());
Self::Out::from_iterator_generic(len, nalgebra::Const::<1>, self.iter().cloned())
}
}
impl<'a, T> IntoNalgebra for ndarray::ArrayView2<'a, T>
where
T: nalgebra::Scalar,
{
type Out = nalgebra::DMatrixView<'a, T, Dyn, Dyn>;
fn into_nalgebra(self) -> Self::Out {
let nrows = Dyn(self.nrows());
let ncols = Dyn(self.ncols());
let ptr = self.as_ptr();
let stride_row: usize = TryFrom::try_from(self.strides()[0])
.expect("can only convert positive row stride to nalgebra");
let stride_col: usize = TryFrom::try_from(self.strides()[1])
.expect("can only convert positive col stride to nalgebra");
let storage = unsafe {
nalgebra::ViewStorage::from_raw_parts(
ptr,
(nrows, ncols),
(Dyn(stride_row), Dyn(stride_col)),
)
};
nalgebra::Matrix::from_data(storage)
}
}
impl<'a, T> IntoNalgebra for ndarray::ArrayViewMut2<'a, T>
where
T: nalgebra::Scalar,
{
type Out = nalgebra::DMatrixViewMut<'a, T, Dyn, Dyn>;
fn into_nalgebra(mut self) -> Self::Out {
let nrows = Dyn(self.nrows());
let ncols = Dyn(self.ncols());
let stride_row: usize = TryFrom::try_from(self.strides()[0])
.expect("can only convert positive row stride to nalgebra");
let stride_col: usize = TryFrom::try_from(self.strides()[1])
.expect("can only convert positive col stride to nalgebra");
let ptr = self.as_mut_ptr();
let storage = unsafe {
nalgebra::ViewStorageMut::from_raw_parts(
ptr,
(nrows, ncols),
(Dyn(stride_row), Dyn(stride_col)),
)
};
nalgebra::Matrix::from_data(storage)
}
}
impl<T> IntoNalgebra for ndarray::Array2<T>
where
T: nalgebra::Scalar,
{
type Out = nalgebra::DMatrix<T>;
fn into_nalgebra(self) -> Self::Out {
let nrows = Dyn(self.nrows());
let ncols = Dyn(self.ncols());
Self::Out::from_iterator_generic(nrows, ncols, self.t().iter().cloned())
}
}