use ndarray::Array2;
#[allow(dead_code)]
pub fn rearrange_matrix<T>(
matrix: &Array2<T>,
row_indices: &[usize],
col_indices: &[usize],
) -> Array2<T>
where
T: Copy + Default,
{
let rows = row_indices.len();
let cols = col_indices.len();
let mut result = Array2::default((rows, cols));
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 ndarray::{Array2, arr2};
#[test]
fn test_rearrange_matrix_basic() {
let matrix: Array2<i32> = arr2(&[[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: Array2<i32> = arr2(&[[3, 2, 1], [6, 5, 4], [9, 8, 7]]);
assert_eq!(result, expected);
}
#[test]
fn test_rearrange_matrix_partial() {
let matrix: Array2<i32> = arr2(&[[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: Array2<i32> = arr2(&[[3, 1], [9, 7]]);
assert_eq!(result, expected);
}
#[test]
fn test_rearrange_matrix_single_element() {
let matrix: Array2<i32> = arr2(&[[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: Array2<i32> = arr2(&[[5]]);
assert_eq!(result, expected);
}
#[test]
fn test_rearrange_matrix_with_duplicates() {
let matrix: Array2<i32> = arr2(&[[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: Array2<i32> = arr2(&[[3, 2, 3], [3, 2, 3], [9, 8, 9]]);
assert_eq!(result, expected);
}
}