(values: &[f64], n_bins: usize)
| 41 | } |
| 42 | |
| 43 | fn histogram(values: &[f64], n_bins: usize) -> CodependenceResult<Vec<usize>> { |
| 44 | if n_bins == 0 { |
| 45 | return Err(CodependenceError::InvalidBins); |
| 46 | } |
| 47 | |
| 48 | let mut min_value = f64::INFINITY; |
| 49 | let mut max_value = f64::NEG_INFINITY; |
| 50 | for value in values { |
| 51 | if *value < min_value { |
| 52 | min_value = *value; |
| 53 | } |
| 54 | if *value > max_value { |
| 55 | max_value = *value; |
| 56 | } |
| 57 | } |
| 58 | |
| 59 | let mut counts = vec![0usize; n_bins]; |
| 60 | if (max_value - min_value).abs() < f64::EPSILON { |
| 61 | counts[n_bins - 1] = values.len(); |
| 62 | return Ok(counts); |
| 63 | } |
| 64 | |
| 65 | let bin_width = (max_value - min_value) / n_bins as f64; |
| 66 | |
| 67 | for value in values { |
| 68 | let mut idx = ((value - min_value) / bin_width).floor() as isize; |
| 69 | if idx < 0 { |
| 70 | idx = 0; |
| 71 | } |
| 72 | if idx as usize >= n_bins { |
| 73 | idx = (n_bins as isize) - 1; |
| 74 | } |
| 75 | counts[idx as usize] += 1; |
| 76 | } |
| 77 | |
| 78 | Ok(counts) |
| 79 | } |
| 80 | |
| 81 | fn histogram2d(x: &[f64], y: &[f64], n_bins: usize) -> CodependenceResult<Vec<Vec<usize>>> { |
| 82 | if x.len() != y.len() { |
no test coverage detected