feat: + cluster metrics

This commit is contained in:
Volodymyr Orlov
2020-09-22 20:23:51 -07:00
parent 0803532e79
commit 750015b861
15 changed files with 477 additions and 16 deletions
+59
View File
@@ -54,6 +54,16 @@ pub struct DenseMatrix<T: RealNumber> {
values: Vec<T>,
}
/// Column-major, dense matrix. See [Simple Dense Matrix](../index.html).
#[derive(Debug)]
pub struct DenseMatrixIterator<'a, T: RealNumber> {
cur_c: usize,
cur_r: usize,
max_c: usize,
max_r: usize,
m: &'a DenseMatrix<T>,
}
impl<T: RealNumber> fmt::Display for DenseMatrix<T> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let mut rows: Vec<Vec<f64>> = Vec::new();
@@ -162,6 +172,36 @@ impl<T: RealNumber> DenseMatrix<T> {
values: values,
}
}
/// Creates new column vector (_1xN_ matrix) from a vector.
/// * `values` - values to initialize the matrix.
pub fn iter<'a>(&'a self) -> DenseMatrixIterator<'a, T> {
DenseMatrixIterator {
cur_c: 0,
cur_r: 0,
max_c: self.ncols,
max_r: self.nrows,
m: &self,
}
}
}
impl<'a, T: RealNumber> Iterator for DenseMatrixIterator<'a, T> {
type Item = T;
fn next(&mut self) -> Option<T> {
if self.cur_r * self.max_c + self.cur_c >= self.max_c * self.max_r {
None
} else {
let v = self.m.get(self.cur_r, self.cur_c);
self.cur_c += 1;
if self.cur_c >= self.max_c {
self.cur_c = 0;
self.cur_r += 1;
}
Some(v)
}
}
}
impl<'de, T: RealNumber + fmt::Debug + Deserialize<'de>> Deserialize<'de> for DenseMatrix<T> {
@@ -339,6 +379,12 @@ impl<T: RealNumber> BaseMatrix<T> for DenseMatrix<T> {
result
}
fn copy_row_as_vec(&self, row: usize, result: &mut Vec<T>) {
for c in 0..self.ncols {
result[c] = self.get(row, c);
}
}
fn get_col_as_vec(&self, col: usize) -> Vec<T> {
let mut result = vec![T::zero(); self.nrows];
for r in 0..self.nrows {
@@ -347,6 +393,12 @@ impl<T: RealNumber> BaseMatrix<T> for DenseMatrix<T> {
result
}
fn copy_col_as_vec(&self, col: usize, result: &mut Vec<T>) {
for r in 0..self.nrows {
result[r] = self.get(r, col);
}
}
fn set(&mut self, row: usize, col: usize, x: T) {
self.values[col * self.nrows + row] = x;
}
@@ -852,6 +904,13 @@ mod tests {
);
}
#[test]
fn iter() {
let vec = vec![1., 2., 3., 4., 5., 6.];
let m = DenseMatrix::from_array(3, 2, &vec);
assert_eq!(vec, m.iter().collect::<Vec<f32>>());
}
#[test]
fn v_stack() {
let a = DenseMatrix::from_2d_array(&[&[1., 2., 3.], &[4., 5., 6.], &[7., 8., 9.]]);