fancy_indexing 1.0.3

numpy's fancy-indexing for Rust linear algebra crates
Documentation
use nalgebra::{DMatrix, Dim, Matrix, Scalar, Storage};

/// Function that rearranges a matrix using the specified row and column indices
///
/// # Arguments
/// - `matrix`: The input matrix (ndarray::Array2)
/// - `row_indices`: Row indices used for rearranging
/// - `col_indices`: Column indices used for rearranging
///
/// # Returns
/// A new matrix after rearrangement
#[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]; // 行0を2回参照
        let col_indices = [2, 1, 2]; // 列2を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);
    }
}