从 SliceStorage 和 SliceStorageMut 中提取原始切片
Extract original slice from SliceStorage and SliceStorageMut
我正在开发一些软件,我在其中管理 Vec<T>
中的浮点缓冲区,其中 T
是 f32
或 f64
。有时我需要将这个缓冲区或它的一部分解释为一个数学向量。为此,我正在利用 MatrixSlice
和 nalgebra
中的朋友。
我可以创建一个DVectorSliceMut
,例如下面的方式
fn as_vector<'a>(slice: &'a mut [f64]) -> DVectorSliceMut<'a, f64> {
DVectorSliceMut::from(slice)
}
但是,有时我需要稍后从具有原始生命周期 'a
的 DVectorSliceMut
中提取原始切片。有办法吗?
StorageMut
trait 有一个 as_mut_slice
成员函数,但是返回的切片的生命周期是对 Storage
实现者的引用的生命周期,而不是原始切片的生命周期。如果有必要,我可以使用 DVectorSliceMut
的解决方案。
更新:方法into_slice
和into_slice_mut
已分别添加到SliceStorage
和SliceStorageMut
特征=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_slice
和 into_slice_mut
方法 return 原始切片已分别添加到 SliceStorage
和 SliceStorageMut
特征中 nalgebra
v0.28.0.
我正在开发一些软件,我在其中管理 Vec<T>
中的浮点缓冲区,其中 T
是 f32
或 f64
。有时我需要将这个缓冲区或它的一部分解释为一个数学向量。为此,我正在利用 MatrixSlice
和 nalgebra
中的朋友。
我可以创建一个DVectorSliceMut
,例如下面的方式
fn as_vector<'a>(slice: &'a mut [f64]) -> DVectorSliceMut<'a, f64> {
DVectorSliceMut::from(slice)
}
但是,有时我需要稍后从具有原始生命周期 'a
的 DVectorSliceMut
中提取原始切片。有办法吗?
StorageMut
trait 有一个 as_mut_slice
成员函数,但是返回的切片的生命周期是对 Storage
实现者的引用的生命周期,而不是原始切片的生命周期。如果有必要,我可以使用 DVectorSliceMut
的解决方案。
更新:方法into_slice
和into_slice_mut
已分别添加到SliceStorage
和SliceStorageMut
特征=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_slice
和 into_slice_mut
方法 return 原始切片已分别添加到 SliceStorage
和 SliceStorageMut
特征中 nalgebra
v0.28.0.