mirror of
https://github.com/Magnus167/rustframe.git
synced 2025-08-20 04:00:01 +00:00
Add transpose method and corresponding tests for Matrix
This commit is contained in:
parent
75f194b8c9
commit
ffe635f1c4
@ -203,6 +203,22 @@ impl<T: Clone> Matrix<T> {
|
||||
self.data = new_data;
|
||||
self.rows = new_rows;
|
||||
}
|
||||
|
||||
pub fn transpose(&self) -> Matrix<T> {
|
||||
let (m, n) = (self.rows, self.cols);
|
||||
let mut transposed_data = Vec::with_capacity(m * n);
|
||||
|
||||
// In the transposed matrix the old rows become the new columns.
|
||||
for j in 0..m {
|
||||
// new column index = old row index
|
||||
for i in 0..n {
|
||||
// new row index = old col index
|
||||
transposed_data.push(self[(j, i)].clone()); // A(T)[i,j] = A[j,i]
|
||||
}
|
||||
}
|
||||
|
||||
Matrix::from_vec(transposed_data, n, m) // size is n × m
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: Clone> Matrix<T> {
|
||||
@ -903,6 +919,40 @@ mod tests {
|
||||
assert_eq!(matrix[(1, 2)], 6); // Second row, third col
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_transpose() {
|
||||
let matrix = static_test_matrix();
|
||||
let transposed = matrix.transpose();
|
||||
let round_triped = transposed.transpose();
|
||||
assert_eq!(
|
||||
round_triped, matrix,
|
||||
"Transposing twice should return original matrix"
|
||||
);
|
||||
for r in 0..matrix.rows() {
|
||||
for c in 0..matrix.cols() {
|
||||
assert_eq!(matrix[(r, c)], transposed[(c, r)]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_transpose_big() {
|
||||
let data: Vec<i32> = (1..=20000).collect(); //
|
||||
let matrix = Matrix::from_vec(data, 100, 200);
|
||||
let transposed = matrix.transpose();
|
||||
assert_eq!(transposed.rows(), 200);
|
||||
assert_eq!(transposed.cols(), 100);
|
||||
assert_eq!(transposed.data().len(), 20000);
|
||||
assert_eq!(transposed[(0, 0)], 1);
|
||||
|
||||
let round_trip = transposed.transpose();
|
||||
|
||||
assert_eq!(
|
||||
round_trip, matrix,
|
||||
"Transposing back should return original matrix"
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[should_panic(expected = "data length mismatch")]
|
||||
fn test_from_vec_wrong_length() {
|
||||
|
Loading…
x
Reference in New Issue
Block a user