#[cfg(test)]
mod tests {
use ferrix::{Matrix, RowVector, Vector};
#[test]
fn test_vector_matmul() {
let v1 = Vector::<i32, 2>::from([1, 2]);
let v2 = RowVector::<i32, 2>::from([4, 5]);
let result = v1 * v2;
assert_eq!(result, Matrix::<i32, 2, 2>::from([[4, 5], [8, 10]]));
let v1 = Vector::<i32, 2>::from([1, 2]);
let v2 = RowVector::<i32, 3>::from([3, 4, 5]);
let view = v2.view::<2>(1).unwrap();
let result = v1 * view;
assert_eq!(result, Matrix::<i32, 2, 2>::from([[4, 5], [8, 10]]));
let v1 = Vector::<i32, 2>::from([1, 2]);
let mut v2 = RowVector::<i32, 3>::from([3, 4, 5]);
let view = v2.view_mut::<2>(1).unwrap();
let result = v1 * view;
assert_eq!(result, Matrix::<i32, 2, 2>::from([[4, 5], [8, 10]]));
let v1 = Vector::<i32, 2>::from([1, 2]);
let m2 = Matrix::<i32, 1, 3>::from([[1, 2, 3]]);
let result = v1 * m2;
assert_eq!(result, Matrix::from([[1, 2, 3], [2, 4, 6]]));
let v1 = Vector::<i32, 2>::from([1, 2]);
let m2 = Matrix::<i32, 2, 3>::from([[1, 2, 3], [4, 5, 6]]);
let view = m2.view::<1, 3>((0, 0)).unwrap();
let result = v1 * view;
assert_eq!(result, Matrix::from([[1, 2, 3], [2, 4, 6]]));
let v1 = Vector::<i32, 2>::from([1, 2]);
let mut m2 = Matrix::<i32, 2, 3>::from([[1, 2, 3], [4, 5, 6]]);
let view = m2.view_mut::<1, 3>((0, 0)).unwrap();
let result = v1 * view;
assert_eq!(result, Matrix::from([[1, 2, 3], [2, 4, 6]]));
let v1 = Vector::<i32, 2>::from([1, 2]);
let m2 = Matrix::<i32, 3, 1>::from([[1], [2], [3]]);
let result = v1 * m2.t();
assert_eq!(result, Matrix::from([[1, 2, 3], [2, 4, 6]]));
let v1 = Vector::<i32, 2>::from([1, 2]);
let mut m2 = Matrix::<i32, 3, 1>::from([[1], [2], [3]]);
let result = v1 * m2.t_mut();
assert_eq!(result, Matrix::from([[1, 2, 3], [2, 4, 6]]));
}
#[test]
fn test_vector_view_matmul() {
let v1 = Vector::<i32, 3>::from([0, 1, 2]);
let v2 = RowVector::<i32, 2>::from([4, 5]);
let view = v1.view::<2>(1).unwrap();
let result = view * v2;
assert_eq!(result, Matrix::<i32, 2, 2>::from([[4, 5], [8, 10]]));
let v1 = Vector::<i32, 3>::from([0, 1, 2]);
let v2 = RowVector::<i32, 3>::from([3, 4, 5]);
let view = v1.view::<2>(1).unwrap();
let result = view * v2.view::<2>(1).unwrap();
assert_eq!(result, Matrix::<i32, 2, 2>::from([[4, 5], [8, 10]]));
let v1 = Vector::<i32, 3>::from([0, 1, 2]);
let mut v2 = RowVector::<i32, 3>::from([3, 4, 5]);
let view = v1.view::<2>(1).unwrap();
let result = view * v2.view_mut::<2>(1).unwrap();
assert_eq!(result, Matrix::<i32, 2, 2>::from([[4, 5], [8, 10]]));
let v1 = Vector::<i32, 3>::from([0, 1, 2]);
let m2 = Matrix::<i32, 1, 3>::from([[1, 2, 3]]);
let view = v1.view::<2>(1).unwrap();
let result = view * m2;
assert_eq!(result, Matrix::<i32, 2, 3>::from([[1, 2, 3], [2, 4, 6]]));
let v1 = Vector::<i32, 3>::from([0, 1, 2]);
let m2 = Matrix::<i32, 2, 3>::from([[1, 2, 3], [4, 5, 6]]);
let view = v1.view::<2>(1).unwrap();
let result = view * m2.view::<1, 3>((0, 0)).unwrap();
assert_eq!(result, Matrix::<i32, 2, 3>::from([[1, 2, 3], [2, 4, 6]]));
let v1 = Vector::<i32, 3>::from([0, 1, 2]);
let mut m2 = Matrix::<i32, 2, 3>::from([[1, 2, 3], [4, 5, 6]]);
let view = v1.view::<2>(1).unwrap();
let result = view * m2.view_mut::<1, 3>((0, 0)).unwrap();
assert_eq!(result, Matrix::<i32, 2, 3>::from([[1, 2, 3], [2, 4, 6]]));
let v1 = Vector::<i32, 3>::from([0, 1, 2]);
let view = v1.view::<2>(1).unwrap();
let m2 = Matrix::<i32, 2, 1>::from([[1], [2]]);
let result = view * m2.t();
assert_eq!(result, Matrix::<i32, 2, 2>::from([[1, 2], [2, 4]]));
let v1 = Vector::<i32, 3>::from([0, 1, 2]);
let view = v1.view::<2>(1).unwrap();
let mut m2 = Matrix::<i32, 2, 1>::from([[1], [2]]);
let result = view * m2.t_mut();
assert_eq!(result, Matrix::<i32, 2, 2>::from([[1, 2], [2, 4]]));
}
#[test]
fn test_vector_view_mut_matmul() {
let mut v1 = Vector::<i32, 3>::from([0, 1, 2]);
let v2 = RowVector::<i32, 2>::from([4, 5]);
let view = v1.view_mut::<2>(1).unwrap();
let result = view * v2;
assert_eq!(result, Matrix::<i32, 2, 2>::from([[4, 5], [8, 10]]));
let mut v1 = Vector::<i32, 3>::from([0, 1, 2]);
let v2 = RowVector::<i32, 3>::from([3, 4, 5]);
let view = v1.view_mut::<2>(1).unwrap();
let result = view * v2.view::<2>(1).unwrap();
assert_eq!(result, Matrix::<i32, 2, 2>::from([[4, 5], [8, 10]]));
let mut v1 = Vector::<i32, 3>::from([0, 1, 2]);
let mut v2 = RowVector::<i32, 3>::from([3, 4, 5]);
let view = v1.view_mut::<2>(1).unwrap();
let result = view * v2.view_mut::<2>(1).unwrap();
assert_eq!(result, Matrix::<i32, 2, 2>::from([[4, 5], [8, 10]]));
let mut v1 = Vector::<i32, 3>::from([0, 1, 2]);
let m2 = Matrix::<i32, 1, 3>::from([[1, 2, 3]]);
let view = v1.view_mut::<2>(1).unwrap();
let result = view * m2;
assert_eq!(result, Matrix::<i32, 2, 3>::from([[1, 2, 3], [2, 4, 6]]));
let mut v1 = Vector::<i32, 3>::from([0, 1, 2]);
let m2 = Matrix::<i32, 2, 3>::from([[1, 2, 3], [4, 5, 6]]);
let view = v1.view_mut::<2>(1).unwrap();
let result = view * m2.view::<1, 3>((0, 0)).unwrap();
assert_eq!(result, Matrix::<i32, 2, 3>::from([[1, 2, 3], [2, 4, 6]]));
let mut v1 = Vector::<i32, 3>::from([0, 1, 2]);
let mut m2 = Matrix::<i32, 2, 3>::from([[1, 2, 3], [4, 5, 6]]);
let view = v1.view_mut::<2>(1).unwrap();
let result = view * m2.view_mut::<1, 3>((0, 0)).unwrap();
assert_eq!(result, Matrix::<i32, 2, 3>::from([[1, 2, 3], [2, 4, 6]]));
let mut v1 = Vector::<i32, 3>::from([0, 1, 2]);
let view = v1.view_mut::<2>(1).unwrap();
let m2 = Matrix::<i32, 2, 1>::from([[1], [2]]);
let result = view * m2.t();
assert_eq!(result, Matrix::<i32, 2, 2>::from([[1, 2], [2, 4]]));
let mut v1 = Vector::<i32, 3>::from([0, 1, 2]);
let view = v1.view_mut::<2>(1).unwrap();
let mut m2 = Matrix::<i32, 2, 1>::from([[1], [2]]);
let result = view * m2.t_mut();
assert_eq!(result, Matrix::<i32, 2, 2>::from([[1, 2], [2, 4]]));
}
#[test]
fn test_row_vector_matmul() {
let v1 = RowVector::<i32, 2>::from([4, 5]);
let v2 = Vector::<i32, 2>::from([1, 2]);
let result = v1 * v2;
assert_eq!(result, Matrix::from([[14]]));
let v1 = RowVector::<i32, 2>::from([4, 5]);
let v2 = Vector::<i32, 3>::from([3, 4, 5]);
let view = v2.view::<2>(1).unwrap();
let result = v1 * view;
assert_eq!(result, Matrix::from([[41]]));
let v1 = RowVector::<i32, 2>::from([4, 5]);
let mut v2 = Vector::<i32, 3>::from([3, 4, 5]);
let view = v2.view_mut::<2>(1).unwrap();
let result = v1 * view;
assert_eq!(result, Matrix::from([[41]]));
let v1 = RowVector::<i32, 2>::from([4, 5]);
let m2 = Matrix::<i32, 2, 3>::from([[1, 2, 3], [4, 5, 6]]);
let result = v1 * m2;
assert_eq!(result, Matrix::from([[24, 33, 42]]));
let v1 = RowVector::<i32, 2>::from([4, 5]);
let m2 = Matrix::<i32, 3, 3>::from([[1, 2, 3], [4, 5, 6], [7, 8, 9]]);
let view = m2.view::<2, 3>((0, 0)).unwrap();
let result = v1 * view;
assert_eq!(result, Matrix::from([[24, 33, 42]]));
let v1 = RowVector::<i32, 2>::from([4, 5]);
let mut m2 = Matrix::<i32, 3, 3>::from([[1, 2, 3], [4, 5, 6], [7, 8, 9]]);
let view = m2.view_mut::<2, 3>((0, 0)).unwrap();
let result = v1 * view;
assert_eq!(result, Matrix::from([[24, 33, 42]]));
let v1 = RowVector::<i32, 2>::from([4, 5]);
let m2 = Matrix::<i32, 1, 2>::from([[1, 2]]);
let result = v1 * m2.t();
assert_eq!(result, Matrix::from([[14]]));
let v1 = RowVector::<i32, 2>::from([4, 5]);
let mut m2 = Matrix::<i32, 1, 2>::from([[1, 2]]);
let result = v1 * m2.t_mut();
assert_eq!(result, Matrix::from([[14]]));
}
#[test]
fn test_row_vector_view_matmul() {
let v1 = RowVector::<i32, 3>::from([1, 2, 3]);
let v2 = Vector::<i32, 2>::from([4, 5]);
let view = v1.view::<2>(1).unwrap();
let result = view * v2;
assert_eq!(result, Matrix::from([[23]]));
let v1 = RowVector::<i32, 3>::from([1, 2, 3]);
let v2 = Vector::<i32, 3>::from([3, 4, 5]);
let view = v1.view::<2>(1).unwrap();
let result = view * v2.view::<2>(1).unwrap();
assert_eq!(result, Matrix::from([[23]]));
let v1 = RowVector::<i32, 3>::from([1, 2, 3]);
let mut v2 = Vector::<i32, 3>::from([3, 4, 5]);
let view = v1.view::<2>(1).unwrap();
let result = view * v2.view_mut::<2>(1).unwrap();
assert_eq!(result, Matrix::from([[23]]));
let v1 = RowVector::<i32, 3>::from([1, 2, 3]);
let m2 = Matrix::<i32, 2, 3>::from([[1, 2, 3], [4, 5, 6]]);
let view = v1.view::<2>(1).unwrap();
let result = view * m2;
assert_eq!(result, Matrix::<i32, 1, 3>::from([[14, 19, 24]]));
let v1 = RowVector::<i32, 3>::from([1, 2, 3]);
let m2 = Matrix::<i32, 2, 4>::from([[4, 1, 2, 3], [2, 4, 5, 6]]);
let view = v1.view::<2>(1).unwrap();
let result = view * m2.view::<2, 3>((0, 1)).unwrap();
assert_eq!(result, Matrix::<i32, 1, 3>::from([[14, 19, 24]]));
let v1 = RowVector::<i32, 3>::from([1, 2, 3]);
let mut m2 = Matrix::<i32, 2, 4>::from([[4, 1, 2, 3], [2, 4, 5, 6]]);
let view = v1.view::<2>(1).unwrap();
let result = view * m2.view_mut::<2, 3>((0, 1)).unwrap();
assert_eq!(result, Matrix::<i32, 1, 3>::from([[14, 19, 24]]));
let v1 = RowVector::<i32, 3>::from([1, 2, 3]);
let m2 = Matrix::<i32, 3, 2>::from([[1, 5], [2, 6], [3, 7]]);
let view = v1.view::<2>(1).unwrap();
let result = view * m2.t();
assert_eq!(result, Matrix::<i32, 1, 3>::from([[17, 22, 27]]));
let v1 = RowVector::<i32, 3>::from([1, 2, 3]);
let mut m2 = Matrix::<i32, 3, 2>::from([[1, 5], [2, 6], [3, 7]]);
let view = v1.view::<2>(1).unwrap();
let result = view * m2.t_mut();
assert_eq!(result, Matrix::<i32, 1, 3>::from([[17, 22, 27]]));
}
#[test]
fn test_row_vector_view_mut_matmul() {
let mut v1 = RowVector::<i32, 3>::from([1, 2, 3]);
let v2 = Vector::<i32, 2>::from([4, 5]);
let view = v1.view_mut::<2>(1).unwrap();
let result = view * v2;
assert_eq!(result, Matrix::from([[23]]));
let mut v1 = RowVector::<i32, 3>::from([1, 2, 3]);
let v2 = Vector::<i32, 3>::from([3, 4, 5]);
let view = v1.view_mut::<2>(1).unwrap();
let result = view * v2.view::<2>(1).unwrap();
assert_eq!(result, Matrix::from([[23]]));
let mut v1 = RowVector::<i32, 3>::from([1, 2, 3]);
let mut v2 = Vector::<i32, 3>::from([3, 4, 5]);
let view = v1.view_mut::<2>(1).unwrap();
let result = view * v2.view_mut::<2>(1).unwrap();
assert_eq!(result, Matrix::from([[23]]));
let mut v1 = RowVector::<i32, 3>::from([1, 2, 3]);
let m2 = Matrix::<i32, 2, 3>::from([[1, 2, 3], [4, 5, 6]]);
let view = v1.view_mut::<2>(1).unwrap();
let result = view * m2;
assert_eq!(result, Matrix::from([[14, 19, 24]]));
let mut v1 = RowVector::<i32, 3>::from([1, 2, 3]);
let m2 = Matrix::<i32, 2, 4>::from([[1, 2, 3, 4], [5, 6, 7, 8]]);
let view = v1.view_mut::<2>(1).unwrap();
let result = view * m2.view::<2, 3>((0, 1)).unwrap();
assert_eq!(result, Matrix::from([[22, 27, 32]]));
let mut v1 = RowVector::<i32, 3>::from([1, 2, 3]);
let mut m2 = Matrix::<i32, 2, 4>::from([[1, 2, 3, 4], [5, 6, 7, 8]]);
let view = v1.view_mut::<2>(1).unwrap();
let result = view * m2.view_mut::<2, 3>((0, 1)).unwrap();
assert_eq!(result, Matrix::from([[22, 27, 32]]));
let mut v1 = RowVector::<i32, 3>::from([1, 2, 3]);
let m2 = Matrix::<i32, 3, 2>::from([[1, 5], [2, 6], [3, 7]]);
let view = v1.view_mut::<2>(1).unwrap();
let result = view * m2.t();
assert_eq!(result, Matrix::from([[17, 22, 27]]));
let mut v1 = RowVector::<i32, 3>::from([1, 2, 3]);
let mut m2 = Matrix::<i32, 3, 2>::from([[1, 5], [2, 6], [3, 7]]);
let view = v1.view_mut::<2>(1).unwrap();
let result = view * m2.t_mut();
assert_eq!(result, Matrix::from([[17, 22, 27]]));
}
#[test]
fn test_matrix_multiplication() {
let m1 = Matrix::<i32, 3, 2>::from([[1, 2], [3, 4], [5, 6]]);
let v2 = Vector::<i32, 2>::from([4, 5]);
let result = m1 * v2;
assert_eq!(result, Matrix::<i32, 3, 1>::from([[14], [32], [50]]));
let m1 = Matrix::<i32, 3, 2>::from([[1, 2], [3, 4], [5, 6]]);
let v2 = Vector::<i32, 3>::from([4, 5, 6]);
let view = v2.view::<2>(1).unwrap();
let result = m1 * view;
assert_eq!(result, Matrix::<i32, 3, 1>::from([[17], [39], [61]]));
let m1 = Matrix::<i32, 3, 2>::from([[1, 2], [3, 4], [5, 6]]);
let mut v2 = Vector::<i32, 3>::from([4, 5, 6]);
let view = v2.view_mut::<2>(1).unwrap();
let result = m1 * view;
assert_eq!(result, Matrix::<i32, 3, 1>::from([[17], [39], [61]]));
let m1 = Matrix::<i32, 3, 1>::from([[1], [3], [5]]);
let v2 = RowVector::<i32, 2>::from([4, 5]);
let result = m1 * v2;
assert_eq!(
result,
Matrix::<i32, 3, 2>::from([[4, 5], [12, 15], [20, 25]])
);
let m1 = Matrix::<i32, 3, 1>::from([[1], [3], [5]]);
let v2 = RowVector::<i32, 3>::from([4, 5, 6]);
let result = m1 * v2.view::<2>(1).unwrap();
assert_eq!(
result,
Matrix::<i32, 3, 2>::from([[5, 6], [15, 18], [25, 30]])
);
let m1 = Matrix::<i32, 3, 1>::from([[1], [3], [5]]);
let mut v2 = RowVector::<i32, 3>::from([4, 5, 6]);
let result = m1 * v2.view_mut::<2>(1).unwrap();
assert_eq!(
result,
Matrix::<i32, 3, 2>::from([[5, 6], [15, 18], [25, 30]])
);
let m1 = Matrix::<i32, 3, 2>::from([[1, 2], [3, 4], [5, 6]]);
let m2 = Matrix::<i32, 2, 3>::from([[1, 2, 3], [4, 5, 6]]);
let result = m1 * m2;
assert_eq!(
result,
Matrix::from([[9, 12, 15], [19, 26, 33], [29, 40, 51]])
);
let m1 = Matrix::<i32, 3, 2>::from([[1, 2], [3, 4], [5, 6]]);
let m2 = Matrix::<i32, 2, 4>::from([[1, 2, 3, 4], [5, 6, 7, 8]]);
let view = m2.view::<2, 4>((0, 0)).unwrap();
let result = m1 * view;
assert_eq!(
result,
Matrix::from([[11, 14, 17, 20], [23, 30, 37, 44], [35, 46, 57, 68]])
);
let m1 = Matrix::<i32, 3, 2>::from([[1, 2], [3, 4], [5, 6]]);
let mut m2 = Matrix::<i32, 2, 4>::from([[1, 2, 3, 4], [5, 6, 7, 8]]);
let view_mut = m2.view_mut::<2, 4>((0, 0)).unwrap();
let result = m1 * view_mut;
assert_eq!(
result,
Matrix::from([[11, 14, 17, 20], [23, 30, 37, 44], [35, 46, 57, 68]])
);
let m1 = Matrix::<i32, 3, 2>::from([[1, 2], [3, 4], [5, 6]]);
let m2 = Matrix::<i32, 4, 2>::from([[1, 5], [2, 6], [3, 7], [4, 8]]);
let t_view = m2.t();
let result = m1 * t_view;
assert_eq!(
result,
Matrix::from([[11, 14, 17, 20], [23, 30, 37, 44], [35, 46, 57, 68]])
);
}
#[test]
fn test_matrix_view_multiplication() {
let m1 = Matrix::<i32, 3, 2>::from([[1, 2], [3, 4], [5, 6]]);
let v2 = Vector::<i32, 2>::from([4, 5]);
let view = m1.view::<3, 2>((0, 0)).unwrap();
let result = view * v2;
assert_eq!(result, Matrix::<i32, 3, 1>::from([[14], [32], [50]]));
let m1 = Matrix::<i32, 3, 2>::from([[1, 2], [3, 4], [5, 6]]);
let v2 = Vector::<i32, 3>::from([4, 5, 6]);
let view = m1.view::<3, 2>((0, 0)).unwrap();
let view2 = v2.view::<2>(1).unwrap();
let result = view * view2;
assert_eq!(result, Matrix::<i32, 3, 1>::from([[17], [39], [61]]));
let m1 = Matrix::<i32, 3, 2>::from([[1, 2], [3, 4], [5, 6]]);
let mut v2 = Vector::<i32, 3>::from([4, 5, 6]);
let view = m1.view::<3, 2>((0, 0)).unwrap();
let view2 = v2.view_mut::<2>(1).unwrap();
let result = view * view2;
assert_eq!(result, Matrix::<i32, 3, 1>::from([[17], [39], [61]]));
let m1 = Matrix::<i32, 3, 2>::from([[1, 2], [3, 4], [5, 6]]);
let v2 = RowVector::<i32, 2>::from([4, 5]);
let view = m1.view::<3, 1>((0, 0)).unwrap();
let result = view * v2;
assert_eq!(
result,
Matrix::<i32, 3, 2>::from([[4, 5], [12, 15], [20, 25]])
);
let m1 = Matrix::<i32, 3, 2>::from([[1, 2], [3, 4], [5, 6]]);
let v2 = RowVector::<i32, 3>::from([4, 5, 6]);
let view = m1.view::<3, 1>((0, 0)).unwrap();
let result = view * v2.view::<2>(1).unwrap();
assert_eq!(
result,
Matrix::<i32, 3, 2>::from([[5, 6], [15, 18], [25, 30]])
);
let m1 = Matrix::<i32, 3, 2>::from([[1, 2], [3, 4], [5, 6]]);
let mut v2 = RowVector::<i32, 3>::from([4, 5, 6]);
let view = m1.view::<3, 1>((0, 0)).unwrap();
let result = view * v2.view_mut::<2>(1).unwrap();
assert_eq!(
result,
Matrix::<i32, 3, 2>::from([[5, 6], [15, 18], [25, 30]])
);
let m1 = Matrix::<i32, 3, 2>::from([[1, 2], [3, 4], [5, 6]]);
let m2 = Matrix::<i32, 2, 4>::from([[1, 2, 3, 4], [5, 6, 7, 8]]);
let view = m1.view::<3, 2>((0, 0)).unwrap();
let result = view * m2;
assert_eq!(
result,
Matrix::from([[11, 14, 17, 20], [23, 30, 37, 44], [35, 46, 57, 68]])
);
let m1 = Matrix::<i32, 3, 2>::from([[1, 2], [3, 4], [5, 6]]);
let m2 = Matrix::<i32, 2, 4>::from([[1, 2, 3, 4], [5, 6, 7, 8]]);
let view1 = m1.view::<3, 2>((0, 0)).unwrap();
let view2 = m2.view::<2, 4>((0, 0)).unwrap();
let result = view1 * view2;
assert_eq!(
result,
Matrix::from([[11, 14, 17, 20], [23, 30, 37, 44], [35, 46, 57, 68]])
);
let m1 = Matrix::<i32, 3, 2>::from([[1, 2], [3, 4], [5, 6]]);
let mut m2 = Matrix::<i32, 2, 4>::from([[1, 2, 3, 4], [5, 6, 7, 8]]);
let view1 = m1.view::<3, 2>((0, 0)).unwrap();
let view_mut = m2.view_mut::<2, 4>((0, 0)).unwrap();
let result = view1 * view_mut;
assert_eq!(
result,
Matrix::from([[11, 14, 17, 20], [23, 30, 37, 44], [35, 46, 57, 68]])
);
let m1 = Matrix::<i32, 3, 2>::from([[1, 2], [3, 4], [5, 6]]);
let m2 = Matrix::<i32, 4, 2>::from([[1, 5], [2, 6], [3, 7], [4, 8]]);
let view1 = m1.view::<3, 2>((0, 0)).unwrap();
let t_view = m2.t();
let result = view1 * t_view;
assert_eq!(
result,
Matrix::from([[11, 14, 17, 20], [23, 30, 37, 44], [35, 46, 57, 68]])
);
}
#[test]
fn test_matrix_view_mut_multiplication() {
let mut m1 = Matrix::<i32, 3, 2>::from([[1, 2], [3, 4], [5, 6]]);
let v2 = Vector::<i32, 2>::from([4, 5]);
let view_mut = m1.view_mut::<3, 2>((0, 0)).unwrap();
let result = view_mut * v2;
assert_eq!(result, Matrix::<i32, 3, 1>::from([[14], [32], [50]]));
let mut m1 = Matrix::<i32, 3, 2>::from([[1, 2], [3, 4], [5, 6]]);
let v2 = Vector::<i32, 3>::from([4, 5, 6]);
let view_mut = m1.view_mut::<3, 2>((0, 0)).unwrap();
let view2 = v2.view::<2>(1).unwrap();
let result = view_mut * view2;
assert_eq!(result, Matrix::<i32, 3, 1>::from([[17], [39], [61]]));
let mut m1 = Matrix::<i32, 3, 2>::from([[1, 2], [3, 4], [5, 6]]);
let mut v2 = Vector::<i32, 3>::from([4, 5, 6]);
let view_mut = m1.view_mut::<3, 2>((0, 0)).unwrap();
let view2 = v2.view_mut::<2>(1).unwrap();
let result = view_mut * view2;
assert_eq!(result, Matrix::<i32, 3, 1>::from([[17], [39], [61]]));
let mut m1 = Matrix::<i32, 3, 2>::from([[1, 2], [3, 4], [5, 6]]);
let v2 = RowVector::<i32, 2>::from([4, 5]);
let view = m1.view_mut::<3, 1>((0, 0)).unwrap();
let result = view * v2;
assert_eq!(
result,
Matrix::<i32, 3, 2>::from([[4, 5], [12, 15], [20, 25]])
);
let mut m1 = Matrix::<i32, 3, 2>::from([[1, 2], [3, 4], [5, 6]]);
let v2 = RowVector::<i32, 3>::from([4, 5, 6]);
let view = m1.view_mut::<3, 1>((0, 0)).unwrap();
let result = view * v2.view::<2>(1).unwrap();
assert_eq!(
result,
Matrix::<i32, 3, 2>::from([[5, 6], [15, 18], [25, 30]])
);
let mut m1 = Matrix::<i32, 3, 2>::from([[1, 2], [3, 4], [5, 6]]);
let mut v2 = RowVector::<i32, 3>::from([4, 5, 6]);
let view = m1.view_mut::<3, 1>((0, 0)).unwrap();
let result = view * v2.view_mut::<2>(1).unwrap();
assert_eq!(
result,
Matrix::<i32, 3, 2>::from([[5, 6], [15, 18], [25, 30]])
);
let mut m1 = Matrix::<i32, 3, 2>::from([[1, 2], [3, 4], [5, 6]]);
let m2 = Matrix::<i32, 2, 4>::from([[1, 2, 3, 4], [5, 6, 7, 8]]);
let view_mut = m1.view_mut::<3, 2>((0, 0)).unwrap();
let result = view_mut * m2;
assert_eq!(
result,
Matrix::from([[11, 14, 17, 20], [23, 30, 37, 44], [35, 46, 57, 68]])
);
let mut m1 = Matrix::<i32, 3, 2>::from([[1, 2], [3, 4], [5, 6]]);
let m2 = Matrix::<i32, 2, 4>::from([[1, 2, 3, 4], [5, 6, 7, 8]]);
let view_mut = m1.view_mut::<3, 2>((0, 0)).unwrap();
let view2 = m2.view::<2, 4>((0, 0)).unwrap();
let result = view_mut * view2;
assert_eq!(
result,
Matrix::from([[11, 14, 17, 20], [23, 30, 37, 44], [35, 46, 57, 68]])
);
let mut m1 = Matrix::<i32, 3, 2>::from([[1, 2], [3, 4], [5, 6]]);
let mut m2 = Matrix::<i32, 2, 4>::from([[1, 2, 3, 4], [5, 6, 7, 8]]);
let view_mut1 = m1.view_mut::<3, 2>((0, 0)).unwrap();
let view_mut2 = m2.view_mut::<2, 4>((0, 0)).unwrap();
let result = view_mut1 * view_mut2;
assert_eq!(
result,
Matrix::from([[11, 14, 17, 20], [23, 30, 37, 44], [35, 46, 57, 68]])
);
let mut m1 = Matrix::<i32, 3, 2>::from([[1, 2], [3, 4], [5, 6]]);
let m2 = Matrix::<i32, 4, 2>::from([[1, 5], [2, 6], [3, 7], [4, 8]]);
let view_mut = m1.view_mut::<3, 2>((0, 0)).unwrap();
let t_view = m2.t();
let result = view_mut * t_view;
assert_eq!(
result,
Matrix::from([[11, 14, 17, 20], [23, 30, 37, 44], [35, 46, 57, 68]])
);
}
#[test]
fn test_matrix_transpose_view_multiplication() {
let m1 = Matrix::<i32, 2, 3>::from([[1, 3, 5], [2, 4, 6]]);
let v2 = Vector::<i32, 2>::from([4, 5]);
let result = m1.t() * v2;
assert_eq!(result, Matrix::<i32, 3, 1>::from([[14], [32], [50]]));
let m1 = Matrix::<i32, 2, 3>::from([[1, 3, 5], [2, 4, 6]]);
let v2 = Vector::<i32, 3>::from([4, 5, 6]);
let result = m1.t() * v2.view::<2>(1).unwrap();
assert_eq!(result, Matrix::<i32, 3, 1>::from([[17], [39], [61]]));
let m1 = Matrix::<i32, 2, 3>::from([[1, 3, 5], [2, 4, 6]]);
let mut v2 = Vector::<i32, 3>::from([4, 5, 6]);
let result = m1.t() * v2.view_mut::<2>(1).unwrap();
assert_eq!(result, Matrix::<i32, 3, 1>::from([[17], [39], [61]]));
let m1 = Matrix::<i32, 1, 3>::from([[1, 2, 3]]);
let v2 = RowVector::<i32, 2>::from([4, 5]);
let result = m1.t() * v2;
assert_eq!(
result,
Matrix::<i32, 3, 2>::from([[4, 5], [8, 10], [12, 15]])
);
let m1 = Matrix::<i32, 1, 3>::from([[1, 2, 3]]);
let v2 = RowVector::<i32, 3>::from([4, 5, 6]);
let result = m1.t() * v2.view::<2>(1).unwrap();
assert_eq!(
result,
Matrix::<i32, 3, 2>::from([[5, 6], [10, 12], [15, 18]])
);
let m1 = Matrix::<i32, 1, 3>::from([[1, 2, 3]]);
let mut v2 = RowVector::<i32, 3>::from([4, 5, 6]);
let result = m1.t() * v2.view_mut::<2>(1).unwrap();
assert_eq!(
result,
Matrix::<i32, 3, 2>::from([[5, 6], [10, 12], [15, 18]])
);
let m1 = Matrix::<i32, 2, 3>::from([[1, 3, 5], [2, 4, 6]]);
let m2 = Matrix::<i32, 2, 4>::from([[1, 2, 3, 4], [5, 6, 7, 8]]);
let result = m1.t() * m2;
assert_eq!(
result,
Matrix::from([[11, 14, 17, 20], [23, 30, 37, 44], [35, 46, 57, 68]])
);
let m1 = Matrix::<i32, 2, 3>::from([[1, 3, 5], [2, 4, 6]]);
let m2 = Matrix::<i32, 2, 4>::from([[1, 2, 3, 4], [5, 6, 7, 8]]);
let result = m1.t() * m2.view::<2, 4>((0, 0)).unwrap();
assert_eq!(
result,
Matrix::from([[11, 14, 17, 20], [23, 30, 37, 44], [35, 46, 57, 68]])
);
let m1 = Matrix::<i32, 2, 3>::from([[1, 3, 5], [2, 4, 6]]);
let mut m2 = Matrix::<i32, 2, 4>::from([[1, 2, 3, 4], [5, 6, 7, 8]]);
let result = m1.t() * m2.view_mut::<2, 4>((0, 0)).unwrap();
assert_eq!(
result,
Matrix::from([[11, 14, 17, 20], [23, 30, 37, 44], [35, 46, 57, 68]])
);
let m1 = Matrix::<i32, 2, 3>::from([[1, 3, 5], [2, 4, 6]]);
let m2 = Matrix::<i32, 3, 2>::from([[1, 2], [3, 4], [5, 6]]);
let result = m1.t() * m2.t();
assert_eq!(
result,
Matrix::from([[5, 11, 17], [11, 25, 39], [17, 39, 61]])
);
}
#[test]
fn test_matrix_transpose_view_mut_multiplication() {
let mut m1 = Matrix::<i32, 2, 3>::from([[1, 3, 5], [2, 4, 6]]);
let v2 = Vector::<i32, 2>::from([4, 5]);
let result = m1.t_mut() * v2;
assert_eq!(result, Matrix::<i32, 3, 1>::from([[14], [32], [50]]));
let mut m1 = Matrix::<i32, 2, 3>::from([[1, 3, 5], [2, 4, 6]]);
let v2 = Vector::<i32, 3>::from([4, 5, 6]);
let result = m1.t_mut() * v2.view::<2>(1).unwrap();
assert_eq!(result, Matrix::<i32, 3, 1>::from([[17], [39], [61]]));
let mut m1 = Matrix::<i32, 2, 3>::from([[1, 3, 5], [2, 4, 6]]);
let mut v2 = Vector::<i32, 3>::from([4, 5, 6]);
let view2 = v2.view_mut::<2>(1).unwrap();
let result = m1.t_mut() * view2;
assert_eq!(result, Matrix::<i32, 3, 1>::from([[17], [39], [61]]));
let mut m1 = Matrix::<i32, 1, 3>::from([[1, 2, 3]]);
let v2 = RowVector::<i32, 2>::from([4, 5]);
let result = m1.t_mut() * v2;
assert_eq!(
result,
Matrix::<i32, 3, 2>::from([[4, 5], [8, 10], [12, 15]])
);
let mut m1 = Matrix::<i32, 1, 3>::from([[1, 2, 3]]);
let v2 = RowVector::<i32, 3>::from([4, 5, 6]);
let result = m1.t_mut() * v2.view::<2>(1).unwrap();
assert_eq!(
result,
Matrix::<i32, 3, 2>::from([[5, 6], [10, 12], [15, 18]])
);
let mut m1 = Matrix::<i32, 1, 3>::from([[1, 2, 3]]);
let mut v2 = RowVector::<i32, 3>::from([4, 5, 6]);
let result = m1.t_mut() * v2.view_mut::<2>(1).unwrap();
assert_eq!(
result,
Matrix::<i32, 3, 2>::from([[5, 6], [10, 12], [15, 18]])
);
let mut m1 = Matrix::<i32, 2, 3>::from([[1, 3, 5], [2, 4, 6]]);
let m2 = Matrix::<i32, 2, 4>::from([[1, 2, 3, 4], [5, 6, 7, 8]]);
let t_view_mut = m1.t_mut();
let result = t_view_mut * m2;
assert_eq!(
result,
Matrix::from([[11, 14, 17, 20], [23, 30, 37, 44], [35, 46, 57, 68]])
);
let mut m1 = Matrix::<i32, 2, 3>::from([[1, 3, 5], [2, 4, 6]]);
let m2 = Matrix::<i32, 2, 4>::from([[1, 2, 3, 4], [5, 6, 7, 8]]);
let view2 = m2.view::<2, 4>((0, 0)).unwrap();
let result = m1.t_mut() * view2;
assert_eq!(
result,
Matrix::from([[11, 14, 17, 20], [23, 30, 37, 44], [35, 46, 57, 68]])
);
let mut m1 = Matrix::<i32, 2, 3>::from([[1, 3, 5], [2, 4, 6]]);
let mut m2 = Matrix::<i32, 2, 4>::from([[1, 2, 3, 4], [5, 6, 7, 8]]);
let view_mut2 = m2.view_mut::<2, 4>((0, 0)).unwrap();
let result = m1.t_mut() * view_mut2;
assert_eq!(
result,
Matrix::from([[11, 14, 17, 20], [23, 30, 37, 44], [35, 46, 57, 68]])
);
let mut m1 = Matrix::<i32, 2, 3>::from([[1, 3, 5], [2, 4, 6]]);
let m2 = Matrix::<i32, 4, 2>::from([[1, 5], [2, 6], [3, 7], [4, 8]]);
let t_view_mut1 = m1.t_mut();
let t_view2 = m2.t();
let result = t_view_mut1 * t_view2;
assert_eq!(
result,
Matrix::from([[11, 14, 17, 20], [23, 30, 37, 44], [35, 46, 57, 68]])
);
}
}