pub struct DenseMatrix<T, V = Vec<T>> {
pub values: V,
pub width: usize,
/* private fields */
}
Expand description
A dense matrix in row-major format, with customizable backing storage.
The data is stored as a flat buffer, where rows are laid out consecutively.
Fields§
§values: V
Flat buffer of matrix values in row-major order.
width: usize
Number of columns in the matrix.
The number of rows is implicitly determined as values.len() / width
.
Implementations§
Source§impl<T: Clone + Send + Sync, S: DenseStorage<T>> DenseMatrix<T, S>
impl<T: Clone + Send + Sync, S: DenseStorage<T>> DenseMatrix<T, S>
Sourcepub fn new(values: S, width: usize) -> Self
pub fn new(values: S, width: usize) -> Self
Create a new dense matrix of the given dimensions, backed by the given storage.
Note that it is undefined behavior to create a matrix such that
values.len() % width != 0
.
Sourcepub fn as_view(&self) -> RowMajorMatrixView<'_, T>
pub fn as_view(&self) -> RowMajorMatrixView<'_, T>
Get a view of the matrix, i.e. a reference to the underlying data.
Sourcepub fn as_view_mut(&mut self) -> RowMajorMatrixViewMut<'_, T>
pub fn as_view_mut(&mut self) -> RowMajorMatrixViewMut<'_, T>
Get a mutable view of the matrix, i.e. a mutable reference to the underlying data.
Sourcepub fn copy_from<S2>(&mut self, source: &DenseMatrix<T, S2>)
pub fn copy_from<S2>(&mut self, source: &DenseMatrix<T, S2>)
Copy the values from the given matrix into this matrix.
Sourcepub fn flatten_to_base<F: Field>(self) -> RowMajorMatrix<F>where
T: ExtensionField<F>,
pub fn flatten_to_base<F: Field>(self) -> RowMajorMatrix<F>where
T: ExtensionField<F>,
Flatten an extension field matrix to a base field matrix.
Sourcepub fn row_slices(&self) -> impl Iterator<Item = &[T]>
pub fn row_slices(&self) -> impl Iterator<Item = &[T]>
Get an iterator over the rows of the matrix.
Sourcepub fn par_row_slices(&self) -> impl IndexedParallelIterator<Item = &[T]>where
T: Sync,
pub fn par_row_slices(&self) -> impl IndexedParallelIterator<Item = &[T]>where
T: Sync,
Get a parallel iterator over the rows of the matrix.
Sourcepub fn rows_mut(&mut self) -> impl Iterator<Item = &mut [T]>
pub fn rows_mut(&mut self) -> impl Iterator<Item = &mut [T]>
Get a mutable iterator over the rows of the matrix.
Sourcepub fn par_rows_mut<'a>(
&'a mut self,
) -> impl IndexedParallelIterator<Item = &'a mut [T]>
pub fn par_rows_mut<'a>( &'a mut self, ) -> impl IndexedParallelIterator<Item = &'a mut [T]>
Get a mutable parallel iterator over the rows of the matrix.
Sourcepub fn horizontally_packed_row_mut<P>(
&mut self,
r: usize,
) -> (&mut [P], &mut [T])
pub fn horizontally_packed_row_mut<P>( &mut self, r: usize, ) -> (&mut [P], &mut [T])
Get a mutable iterator over the rows of the matrix which packs the rows into packed values.
If P::WIDTH
does not divide self.width
, the remainder of the row will be returned as a
base slice.
Sourcepub fn par_scale_row(&mut self, r: usize, scale: T)
pub fn par_scale_row(&mut self, r: usize, scale: T)
Scale the given row by the given value.
§Performance
This function is parallelized, which may introduce some overhead compared to
Self::scale_row
when the width is small.
§Panics
Panics if r
larger than self.height()
.
Sourcepub fn split_rows(
&self,
r: usize,
) -> (RowMajorMatrixView<'_, T>, RowMajorMatrixView<'_, T>)
pub fn split_rows( &self, r: usize, ) -> (RowMajorMatrixView<'_, T>, RowMajorMatrixView<'_, T>)
Split the matrix into two matrix views, one with the first r
rows and one with the remaining rows.
§Panics
Panics if r
larger than self.height()
.
Sourcepub fn split_rows_mut(
&mut self,
r: usize,
) -> (RowMajorMatrixViewMut<'_, T>, RowMajorMatrixViewMut<'_, T>)
pub fn split_rows_mut( &mut self, r: usize, ) -> (RowMajorMatrixViewMut<'_, T>, RowMajorMatrixViewMut<'_, T>)
Split the matrix into two mutable matrix views, one with the first r
rows and one with the remaining rows.
§Panics
Panics if r
larger than self.height()
.
Sourcepub fn par_row_chunks(
&self,
chunk_rows: usize,
) -> impl IndexedParallelIterator<Item = RowMajorMatrixView<'_, T>>where
T: Send,
pub fn par_row_chunks(
&self,
chunk_rows: usize,
) -> impl IndexedParallelIterator<Item = RowMajorMatrixView<'_, T>>where
T: Send,
Get an iterator over the rows of the matrix which takes chunk_rows
rows at a time.
If chunk_rows
does not divide the height of the matrix, the last chunk will be smaller.
Sourcepub fn par_row_chunks_exact(
&self,
chunk_rows: usize,
) -> impl IndexedParallelIterator<Item = RowMajorMatrixView<'_, T>>where
T: Send,
pub fn par_row_chunks_exact(
&self,
chunk_rows: usize,
) -> impl IndexedParallelIterator<Item = RowMajorMatrixView<'_, T>>where
T: Send,
Get a parallel iterator over the rows of the matrix which takes chunk_rows
rows at a time.
If chunk_rows
does not divide the height of the matrix, the last chunk will be smaller.
Sourcepub fn par_row_chunks_mut(
&mut self,
chunk_rows: usize,
) -> impl IndexedParallelIterator<Item = RowMajorMatrixViewMut<'_, T>>
pub fn par_row_chunks_mut( &mut self, chunk_rows: usize, ) -> impl IndexedParallelIterator<Item = RowMajorMatrixViewMut<'_, T>>
Get a mutable iterator over the rows of the matrix which takes chunk_rows
rows at a time.
If chunk_rows
does not divide the height of the matrix, the last chunk will be smaller.
Sourcepub fn row_chunks_exact_mut(
&mut self,
chunk_rows: usize,
) -> impl Iterator<Item = RowMajorMatrixViewMut<'_, T>>
pub fn row_chunks_exact_mut( &mut self, chunk_rows: usize, ) -> impl Iterator<Item = RowMajorMatrixViewMut<'_, T>>
Get a mutable iterator over the rows of the matrix which takes chunk_rows
rows at a time.
If chunk_rows
does not divide the height of the matrix, the last up to chunk_rows - 1
rows
of the matrix will be omitted.
Sourcepub fn par_row_chunks_exact_mut(
&mut self,
chunk_rows: usize,
) -> impl IndexedParallelIterator<Item = RowMajorMatrixViewMut<'_, T>>
pub fn par_row_chunks_exact_mut( &mut self, chunk_rows: usize, ) -> impl IndexedParallelIterator<Item = RowMajorMatrixViewMut<'_, T>>
Get a parallel mutable iterator over the rows of the matrix which takes chunk_rows
rows at a time.
If chunk_rows
does not divide the height of the matrix, the last up to chunk_rows - 1
rows
of the matrix will be omitted.
Sourcepub fn row_pair_mut(
&mut self,
row_1: usize,
row_2: usize,
) -> (&mut [T], &mut [T])
pub fn row_pair_mut( &mut self, row_1: usize, row_2: usize, ) -> (&mut [T], &mut [T])
Get a pair of mutable slices of the given rows.
§Panics
Panics if row_1
or row_2
are out of bounds or if row_1 >= row_2
.
Sourcepub fn packed_row_pair_mut<P>(
&mut self,
row_1: usize,
row_2: usize,
) -> ((&mut [P], &mut [T]), (&mut [P], &mut [T]))
pub fn packed_row_pair_mut<P>( &mut self, row_1: usize, row_2: usize, ) -> ((&mut [P], &mut [T]), (&mut [P], &mut [T]))
Get a pair of mutable slices of the given rows, both packed into packed field elements.
If P:WIDTH
does not divide self.width
, the remainder of the row will be returned as a base slice.
§Panics
Panics if row_1
or row_2
are out of bounds or if row_1 >= row_2
.
Sourcepub fn bit_reversed_zero_pad(self, added_bits: usize) -> RowMajorMatrix<T>where
T: Field,
pub fn bit_reversed_zero_pad(self, added_bits: usize) -> RowMajorMatrix<T>where
T: Field,
Append zeros to the “end” of the given matrix, except that the matrix is in bit-reversed order, so in actuality we’re interleaving zero rows.
Source§impl<T: Clone + Default + Send + Sync> DenseMatrix<T>
impl<T: Clone + Default + Send + Sync> DenseMatrix<T>
pub fn as_cow<'a>(self) -> RowMajorMatrixCow<'a, T>
pub fn rand<R: Rng>(rng: &mut R, rows: usize, cols: usize) -> Selfwhere
StandardUniform: Distribution<T>,
pub fn rand_nonzero<R: Rng>(rng: &mut R, rows: usize, cols: usize) -> Self
pub fn pad_to_height(&mut self, new_height: usize, fill: T)
Source§impl<T: Copy + Default + Send + Sync, V: DenseStorage<T>> DenseMatrix<T, V>
impl<T: Copy + Default + Send + Sync, V: DenseStorage<T>> DenseMatrix<T, V>
Sourcepub fn transpose(&self) -> RowMajorMatrix<T>
pub fn transpose(&self) -> RowMajorMatrix<T>
Return the transpose of this matrix.
Sourcepub fn transpose_into<W: DenseStorage<T> + BorrowMut<[T]>>(
&self,
other: &mut DenseMatrix<T, W>,
)
pub fn transpose_into<W: DenseStorage<T> + BorrowMut<[T]>>( &self, other: &mut DenseMatrix<T, W>, )
Transpose the matrix returning the result in other
without intermediate allocation.
Trait Implementations§
Source§impl<T: Clone + Send + Sync, S: DenseStorage<T>> BitReversibleMatrix<T> for DenseMatrix<T, S>
impl<T: Clone + Send + Sync, S: DenseStorage<T>> BitReversibleMatrix<T> for DenseMatrix<T, S>
Source§type BitRev = RowIndexMappedView<BitReversalPerm, DenseMatrix<T, S>>
type BitRev = RowIndexMappedView<BitReversalPerm, DenseMatrix<T, S>>
Source§fn bit_reverse_rows(self) -> Self::BitRev
fn bit_reverse_rows(self) -> Self::BitRev
Source§impl<T: Clone, V: Clone> Clone for DenseMatrix<T, V>
impl<T: Clone, V: Clone> Clone for DenseMatrix<T, V>
Source§fn clone(&self) -> DenseMatrix<T, V>
fn clone(&self) -> DenseMatrix<T, V>
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moreSource§impl<'de, T, V> Deserialize<'de> for DenseMatrix<T, V>where
V: Deserialize<'de>,
impl<'de, T, V> Deserialize<'de> for DenseMatrix<T, V>where
V: Deserialize<'de>,
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Source§impl<T: Clone + Send + Sync, S: DenseStorage<T>> Matrix<T> for DenseMatrix<T, S>
impl<T: Clone + Send + Sync, S: DenseStorage<T>> Matrix<T> for DenseMatrix<T, S>
Source§unsafe fn get_unchecked(&self, r: usize, c: usize) -> T
unsafe fn get_unchecked(&self, r: usize, c: usize) -> T
Source§unsafe fn row_subseq_unchecked(
&self,
r: usize,
start: usize,
end: usize,
) -> impl IntoIterator<Item = T, IntoIter = impl Iterator<Item = T> + Send + Sync>
unsafe fn row_subseq_unchecked( &self, r: usize, start: usize, end: usize, ) -> impl IntoIterator<Item = T, IntoIter = impl Iterator<Item = T> + Send + Sync>
Source§unsafe fn row_subslice_unchecked(
&self,
r: usize,
start: usize,
end: usize,
) -> impl Deref<Target = [T]>
unsafe fn row_subslice_unchecked( &self, r: usize, start: usize, end: usize, ) -> impl Deref<Target = [T]>
r
-th row as something which can be coerced to a slice. Read moreSource§fn to_row_major_matrix(self) -> RowMajorMatrix<T>
fn to_row_major_matrix(self) -> RowMajorMatrix<T>
RowMajorMatrix
by collecting all rows into a single vector.Source§fn horizontally_packed_row<'a, P>(
&'a self,
r: usize,
) -> (impl Iterator<Item = P> + Send + Sync, impl Iterator<Item = T> + Send + Sync)where
P: PackedValue<Value = T>,
T: Clone + 'a,
fn horizontally_packed_row<'a, P>(
&'a self,
r: usize,
) -> (impl Iterator<Item = P> + Send + Sync, impl Iterator<Item = T> + Send + Sync)where
P: PackedValue<Value = T>,
T: Clone + 'a,
r
-th row. Read moreSource§fn padded_horizontally_packed_row<'a, P>(
&'a self,
r: usize,
) -> impl Iterator<Item = P> + Send + Sync
fn padded_horizontally_packed_row<'a, P>( &'a self, r: usize, ) -> impl Iterator<Item = P> + Send + Sync
r
-th row. Read moreSource§fn dimensions(&self) -> Dimensions
fn dimensions(&self) -> Dimensions
Source§fn get(&self, r: usize, c: usize) -> Option<T>
fn get(&self, r: usize, c: usize) -> Option<T>
Source§fn row(
&self,
r: usize,
) -> Option<impl IntoIterator<Item = T, IntoIter = impl Iterator<Item = T> + Send + Sync>>
fn row( &self, r: usize, ) -> Option<impl IntoIterator<Item = T, IntoIter = impl Iterator<Item = T> + Send + Sync>>
r
-th row. Read moreSource§unsafe fn row_unchecked(
&self,
r: usize,
) -> impl IntoIterator<Item = T, IntoIter = impl Iterator<Item = T> + Send + Sync>
unsafe fn row_unchecked( &self, r: usize, ) -> impl IntoIterator<Item = T, IntoIter = impl Iterator<Item = T> + Send + Sync>
r
-th row. Read moreSource§fn row_slice(&self, r: usize) -> Option<impl Deref<Target = [T]>>
fn row_slice(&self, r: usize) -> Option<impl Deref<Target = [T]>>
r
-th row as something which can be coerced to a slice. Read moreSource§unsafe fn row_slice_unchecked(&self, r: usize) -> impl Deref<Target = [T]>
unsafe fn row_slice_unchecked(&self, r: usize) -> impl Deref<Target = [T]>
r
-th row as something which can be coerced to a slice. Read moreSource§fn rows(&self) -> impl Iterator<Item = impl Iterator<Item = T>> + Send + Sync
fn rows(&self) -> impl Iterator<Item = impl Iterator<Item = T>> + Send + Sync
Source§fn par_rows(
&self,
) -> impl IndexedParallelIterator<Item = impl Iterator<Item = T>> + Send + Sync
fn par_rows( &self, ) -> impl IndexedParallelIterator<Item = impl Iterator<Item = T>> + Send + Sync
Source§fn wrapping_row_slices(
&self,
r: usize,
c: usize,
) -> Vec<impl Deref<Target = [T]>>
fn wrapping_row_slices( &self, r: usize, c: usize, ) -> Vec<impl Deref<Target = [T]>>
r
through r + c
. If anything is larger than self.height()
simply wrap around to the beginning of the matrix.Source§fn first_row(
&self,
) -> Option<impl IntoIterator<Item = T, IntoIter = impl Iterator<Item = T> + Send + Sync>>
fn first_row( &self, ) -> Option<impl IntoIterator<Item = T, IntoIter = impl Iterator<Item = T> + Send + Sync>>
Source§fn last_row(
&self,
) -> Option<impl IntoIterator<Item = T, IntoIter = impl Iterator<Item = T> + Send + Sync>>
fn last_row( &self, ) -> Option<impl IntoIterator<Item = T, IntoIter = impl Iterator<Item = T> + Send + Sync>>
Source§fn par_horizontally_packed_rows<'a, P>(
&'a self,
) -> impl IndexedParallelIterator<Item = (impl Iterator<Item = P> + Send + Sync, impl Iterator<Item = T> + Send + Sync)>where
P: PackedValue<Value = T>,
T: Clone + 'a,
fn par_horizontally_packed_rows<'a, P>(
&'a self,
) -> impl IndexedParallelIterator<Item = (impl Iterator<Item = P> + Send + Sync, impl Iterator<Item = T> + Send + Sync)>where
P: PackedValue<Value = T>,
T: Clone + 'a,
Source§fn par_padded_horizontally_packed_rows<'a, P>(
&'a self,
) -> impl IndexedParallelIterator<Item = impl Iterator<Item = P> + Send + Sync>
fn par_padded_horizontally_packed_rows<'a, P>( &'a self, ) -> impl IndexedParallelIterator<Item = impl Iterator<Item = P> + Send + Sync>
Source§fn vertically_packed_row<P>(&self, r: usize) -> impl Iterator<Item = P>where
T: Copy,
P: PackedValue<Value = T>,
fn vertically_packed_row<P>(&self, r: usize) -> impl Iterator<Item = P>where
T: Copy,
P: PackedValue<Value = T>,
Source§fn vertically_packed_row_pair<P>(&self, r: usize, step: usize) -> Vec<P>where
T: Copy,
P: PackedValue<Value = T>,
fn vertically_packed_row_pair<P>(&self, r: usize, step: usize) -> Vec<P>where
T: Copy,
P: PackedValue<Value = T>,
Source§fn vertically_strided(
self,
stride: usize,
offset: usize,
) -> VerticallyStridedMatrixView<Self>where
Self: Sized,
fn vertically_strided(
self,
stride: usize,
offset: usize,
) -> VerticallyStridedMatrixView<Self>where
Self: Sized,
Source§fn columnwise_dot_product<EF>(&self, v: &[EF]) -> Vec<EF>where
T: Field,
EF: ExtensionField<T>,
fn columnwise_dot_product<EF>(&self, v: &[EF]) -> Vec<EF>where
T: Field,
EF: ExtensionField<T>,
v
and take the sum across rows.
v
can be a vector of extension elements.Source§fn rowwise_packed_dot_product<EF>(
&self,
vec: &[EF::ExtensionPacking],
) -> impl IndexedParallelIterator<Item = EF>where
T: Field,
EF: ExtensionField<T>,
fn rowwise_packed_dot_product<EF>(
&self,
vec: &[EF::ExtensionPacking],
) -> impl IndexedParallelIterator<Item = EF>where
T: Field,
EF: ExtensionField<T>,
M . vec
, aka take the dot product of each
row of M
by vec
. If the length of vec
is longer than the width of M
,
vec
is truncated to the first width()
elements. Read moreSource§impl<T, V> Serialize for DenseMatrix<T, V>where
V: Serialize,
impl<T, V> Serialize for DenseMatrix<T, V>where
V: Serialize,
impl<T: Copy, V: Copy> Copy for DenseMatrix<T, V>
impl<T: Eq, V: Eq> Eq for DenseMatrix<T, V>
impl<T, V> StructuralPartialEq for DenseMatrix<T, V>
Auto Trait Implementations§
impl<T, V> Freeze for DenseMatrix<T, V>where
V: Freeze,
impl<T, V> RefUnwindSafe for DenseMatrix<T, V>where
V: RefUnwindSafe,
T: RefUnwindSafe,
impl<T, V> Send for DenseMatrix<T, V>
impl<T, V> Sync for DenseMatrix<T, V>
impl<T, V> Unpin for DenseMatrix<T, V>
impl<T, V> UnwindSafe for DenseMatrix<T, V>where
V: UnwindSafe,
T: UnwindSafe,
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read more