use nalgebra::{DMatrix, Dim, Matrix, Scalar, Storage};
#[allow(dead_code)]
pub fn rearrange_matrix<T, R, C, S>(
matrix: &Matrix<T, R, C, S>,
row_indices: &[usize],
col_indices: &[usize],
) -> DMatrix<T>
where
T: Scalar + Copy + Default,
R: Dim,
C: Dim,
S: Storage<T, R, C>,
{
let rows = row_indices.len();
let cols = col_indices.len();
let mut result = DMatrix::from_element(rows, cols, T::default());
for (new_row, &row) in row_indices.iter().enumerate() {
for (new_col, &col) in col_indices.iter().enumerate() {
result[(new_row, new_col)] = matrix[(row, col)];
}
}
result
}
#[cfg(test)]
mod tests {
use super::*;
use nalgebra::DMatrix;
#[test]
fn test_rearrange_matrix_basic() {
let matrix = DMatrix::from_row_slice(3, 3, &[1, 2, 3, 4, 5, 6, 7, 8, 9]);
let row_indices = [0, 1, 2];
let col_indices = [2, 1, 0];
let result = rearrange_matrix(&matrix, &row_indices, &col_indices);
let expected = DMatrix::from_row_slice(3, 3, &[3, 2, 1, 6, 5, 4, 9, 8, 7]);
assert_eq!(result, expected);
}
#[test]
fn test_rearrange_matrix_partial() {
let matrix = DMatrix::from_row_slice(3, 3, &[1, 2, 3, 4, 5, 6, 7, 8, 9]);
let row_indices = [0, 2];
let col_indices = [2, 0];
let result = rearrange_matrix(&matrix, &row_indices, &col_indices);
let expected = DMatrix::from_row_slice(2, 2, &[3, 1, 9, 7]);
assert_eq!(result, expected);
}
#[test]
fn test_rearrange_matrix_single_element() {
let matrix = DMatrix::from_row_slice(3, 3, &[1, 2, 3, 4, 5, 6, 7, 8, 9]);
let row_indices = [1];
let col_indices = [1];
let result = rearrange_matrix(&matrix, &row_indices, &col_indices);
let expected = DMatrix::from_element(1, 1, 5);
assert_eq!(result, expected);
}
#[test]
fn test_rearrange_matrix_with_duplicates() {
let matrix = DMatrix::from_row_slice(3, 3, &[1, 2, 3, 4, 5, 6, 7, 8, 9]);
let row_indices = [0, 0, 2]; let col_indices = [2, 1, 2];
let result = rearrange_matrix(&matrix, &row_indices, &col_indices);
let expected = DMatrix::from_row_slice(3, 3, &[3, 2, 3, 3, 2, 3, 9, 8, 9]);
assert_eq!(result, expected);
}
}