从 SliceStorage 和 SliceStorageMut 中提取原始切片

Extract original slice from SliceStorage and SliceStorageMut

我正在开发一些软件,我在其中管理 Vec<T> 中的浮点缓冲区,其中 Tf32f64。有时我需要将这个缓冲区或它的一部分解释为一个数学向量。为此,我正在利用 MatrixSlicenalgebra 中的朋友。

我可以创建一个DVectorSliceMut,例如下面的方式

fn as_vector<'a>(slice: &'a mut [f64]) -> DVectorSliceMut<'a, f64> {
    DVectorSliceMut::from(slice)
}

但是,有时我需要稍后从具有原始生命周期 'aDVectorSliceMut 中提取原始切片。有办法吗?

StorageMut trait 有一个 as_mut_slice 成员函数,但是返回的切片的生命周期是对 Storage 实现者的引用的生命周期,而不是原始切片的生命周期。如果有必要,我可以使用 DVectorSliceMut 的解决方案。

更新:方法into_sliceinto_slice_mut已分别添加到SliceStorageSliceStorageMut特征=16=] v0.28.0.

鉴于 nalgebra (v0.27.1) 的当前 API,您无能为力,除了:

  • 寿命StorageMut::as_mut_slice
  • 中较短的寿命
  • nalgebra (which seems you already did)
  • 提出对此类功能的功能请求
  • 使用您自己的 unsafe 代码将 StorageMut::ptr_mut 变成 &'a mut

您可以选择第三个选项,直到 nalgebra 获得更新并在您自己的代码中实现类似 this 的内容:

use nalgebra::base::dimension::Dim;
use nalgebra::base::storage::Storage;
use nalgebra::base::storage::StorageMut;

fn into_slice<'a>(vec: DVectorSliceMut<'a, f64>) -> &'a mut [f64] {
    let mut inner = vec.data;
    // from nalgebra
    // https://docs.rs/nalgebra/0.27.1/src/nalgebra/base/matrix_slice.rs.html#190
    let (nrows, ncols) = inner.shape();
    if nrows.value() != 0 && ncols.value() != 0 {
        let sz = inner.linear_index(nrows.value() - 1, ncols.value() - 1);
        unsafe { core::slice::from_raw_parts_mut(inner.ptr_mut(), sz + 1) }
    } else {
        unsafe { core::slice::from_raw_parts_mut(inner.ptr_mut(), 0) }
    }
}

into_sliceinto_slice_mut 方法 return 原始切片已分别添加到 SliceStorageSliceStorageMut 特征中 nalgebra v0.28.0.