feat: allocate first and then proceed to create matrix from Vec of Ro… (#159)

* feat: allocate first and then proceed to create matrix from Vec of RowVectors
This commit is contained in:
morenol
2022-09-20 06:29:54 -04:00
committed by GitHub
parent 6a2e10452f
commit c21e75276a
+45 -9
View File
@@ -343,16 +343,19 @@ pub trait BaseMatrix<T: RealNumber>: Clone + Debug {
/// ]) /// ])
/// ); /// );
fn from_row_vectors(rows: Vec<Self::RowVector>) -> Option<Self> { fn from_row_vectors(rows: Vec<Self::RowVector>) -> Option<Self> {
if let Some(first_row) = rows.first().cloned() { if rows.is_empty() {
return Some(rows.iter().skip(1).cloned().fold( return None;
Self::from_row_vector(first_row),
|current_matrix, new_row| {
current_matrix.v_stack(&BaseMatrix::from_row_vector(new_row))
},
));
} else {
None
} }
let n = rows.len();
let m = rows[0].len();
let mut result = Self::zeros(n, m);
for (row_idx, row) in rows.into_iter().enumerate() {
result.set_row(row_idx, row);
}
Some(result)
} }
/// Transforms 1-d matrix of 1xM into a row vector. /// Transforms 1-d matrix of 1xM into a row vector.
@@ -376,6 +379,13 @@ pub trait BaseMatrix<T: RealNumber>: Clone + Debug {
/// * `result` - receiver for the row /// * `result` - receiver for the row
fn copy_row_as_vec(&self, row: usize, result: &mut Vec<T>); fn copy_row_as_vec(&self, row: usize, result: &mut Vec<T>);
/// Set row vector at row `row_idx`.
fn set_row(&mut self, row_idx: usize, row: Self::RowVector) {
for (col_idx, val) in row.to_vec().into_iter().enumerate() {
self.set(row_idx, col_idx, val);
}
}
/// Get a vector with elements of the `col`'th column /// Get a vector with elements of the `col`'th column
/// * `col` - column number /// * `col` - column number
fn get_col_as_vec(&self, col: usize) -> Vec<T>; fn get_col_as_vec(&self, col: usize) -> Vec<T>;
@@ -836,6 +846,32 @@ mod tests {
"The second column was not extracted correctly" "The second column was not extracted correctly"
); );
} }
#[test]
fn test_from_row_vectors_simple() {
let eye = DenseMatrix::from_row_vectors(vec![
vec![1., 0., 0.],
vec![0., 1., 0.],
vec![0., 0., 1.],
])
.unwrap();
assert_eq!(
eye,
DenseMatrix::from_2d_vec(&vec![
vec![1.0, 0.0, 0.0],
vec![0.0, 1.0, 0.0],
vec![0.0, 0.0, 1.0],
])
);
}
#[test]
fn test_from_row_vectors_large() {
let eye = DenseMatrix::from_row_vectors(vec![vec![4.25; 5000]; 5000]).unwrap();
assert_eq!(eye.shape(), (5000, 5000));
assert_eq!(eye.get_row(5), vec![4.25; 5000]);
}
mod matrix_from_csv { mod matrix_from_csv {
use crate::linalg::naive::dense_matrix::DenseMatrix; use crate::linalg::naive::dense_matrix::DenseMatrix;