diff --git a/nalgebra-sparse/src/ops/serial/cs.rs b/nalgebra-sparse/src/ops/serial/cs.rs index ec394c27..aa9d93d9 100644 --- a/nalgebra-sparse/src/ops/serial/cs.rs +++ b/nalgebra-sparse/src/ops/serial/cs.rs @@ -34,9 +34,6 @@ where { let some_val = Zero::zero(); let mut scratchpad_values: Vec = vec![some_val; b.pattern().minor_dim()]; - let mut scratchpad_indices: Vec = vec![0; b.pattern().minor_dim()]; - let mut scratchpad_used: Vec = vec![false; b.pattern().minor_dim()]; - let mut right_end = 0usize; for i in 0..c.pattern().major_dim() { let a_lane_i = a.get_lane(i).unwrap(); @@ -48,26 +45,19 @@ where for (j, b_kj) in b_lane_k.minor_indices().iter().zip(b_lane_k.values()) { // Determine the location in C to append the value scratchpad_values[*j] += alpha_aik.clone() * b_kj.clone(); - if !scratchpad_used[*j] { - scratchpad_indices[right_end] = *j; - right_end += 1; - scratchpad_used[*j] = true; - } } } // sort the indices, and then access the relevant indices (in sorted order) from values // into C. - scratchpad_indices[0..right_end].sort_unstable(); - c_lane_i - .values_mut() + let (indices, values) = c_lane_i.indices_and_values_mut(); + + values .iter_mut() - .zip(scratchpad_indices[0..right_end].iter()) + .zip(indices) .for_each(|(output_ref, index)| { *output_ref = beta.clone() * output_ref.clone() + scratchpad_values[*index].clone(); - scratchpad_used[*index] = false; scratchpad_values[*index] = Zero::zero(); }); - right_end = 0usize; } Ok(())