Sponsoring The Perl Toolchain Summit 2025: Help make this important event another success Learn more

#!/usr/bin/ruby
# Tests for the Matrix class
var A = %m(
2 -3 1; # comment test #1
1 -2 -2;
3 -4, 1; # comment test #2
)
var B = %m(
9, -3, -2;
3, -1, 7;
2, -4, -8 # comment test
)
var C = Matrix(
[2, -1, 5, 1],
[3, 2, 2, -6],
[1, 3, 3, -1],
[5, -2, -3, 3],
)
assert_eq(A+B, [[11, -6, -1], [4, -3, 5], [5, -8, -7]])
assert_eq(A-B, [[-7, 0, 3], [-2, -1, -9], [1, 0, 9]])
assert_eq(A*B, [[11, -7, -33], [-1, 7, 0], [17, -9, -42]])
assert_eq(A/B, [[-26/115, 101/115, 7/10], [-2/23, 6/23, 1/2], [-27/115, 127/115, 9/10]])
assert_eq(B+A, [[11, -6, -1], [4, -3, 5], [5, -8, -7]])
assert_eq(B-A, [[7, 0, -3], [2, 1, 9], [-1, 0, -9]])
assert_eq(B*A, [[9, -13, 13], [26, -35, 12], [-24, 34, 2]])
assert_eq(B/A, [[-73/3, -4/3, 59/3], [-3, -3, 4], [-8/3, 10/3, 4/3]])
assert_eq(A+42, [[44, 39, 43], [43, 40, 40], [45, 38, 43]])
assert_eq(A-42, [[-40, -45, -41], [-41, -44, -44], [-39, -46, -41]])
assert_eq(A*42, [[84, -126, 42], [42, -84, -84], [126, -168, 42]])
assert_eq(A/42, [[1/21, -1/14, 1/42], [1/42, -1/21, -1/21], [1/14, -2/21, 1/42]])
assert_eq(B+42, [[51, 39, 40], [45, 41, 49], [44, 38, 34]])
assert_eq(B-42, [[-33, -45, -44], [-39, -43, -35], [-40, -46, -50]])
assert_eq(B*42, [[378, -126, -84], [126, -42, 294], [84, -168, -336]])
assert_eq(B/42, [[3/14, -1/14, -1/21], [1/14, -1/42, 1/6], [1/21, -2/21, -4/21]])
assert_eq(A**3, A * A * A)
assert_eq(A**4, A * A * A *A)
assert_eq(B**3, [[518, -96, -64], [96, 198, 224], [64, -128, -26]])
assert_eq(B**4, [[4246, -1202, -1196], [1906, -1382, -598], [140, 40, -816]])
assert_eq(A**-2, (A**2).inv)
assert_eq(B**-3, (B**3).inv)
assert_eq(A**-1, A.inv)
assert_eq(B**-1, B.inv)
assert_eq(A.inv, [[-10/3, -1/3, 8/3], [-7/3, -1/3, 5/3], [2/3, -1/3, -1/3]])
assert_eq(B.inv, [[18/115, -8/115, -1/10], [19/115, -34/115, -3/10], [-1/23, 3/23, 0]])
assert_eq(A.gauss_jordan_invert, A.inv)
assert_eq(B.gauss_jordan_invert, B.inv)
assert_eq(C.gauss_jordan_invert, C.inv)
assert_eq(A.det, 3)
assert_eq(B.det, 230)
assert_eq(C.det, 684)
assert_eq(A.det_bareiss, 3)
assert_eq(B.det_bareiss, 230)
assert_eq(C.det_bareiss, 684)
assert_eq(C.solve([-3, -32, -47, 49]), [2, -12, -4, 1])
assert_eq(C.gauss_jordan_solve([-3, -32, -47, 49]), [2, -12, -4, 1])
assert_eq(A.solve([-3, 43, 9]), [59/3, 23/3, -58/3])
assert_eq(B.solve([-3, 43, 9]), [-1003/230, -3659/230, 132/23])
assert_eq(A.transpose, [[2, 1, 3], [-3, -2, -4], [1, -2, 1]])
assert_eq(C.transpose, [[2, 3, 1, 5], [-1, 2, 3, -2], [5, 2, 3, -3], [1, -6, -1, 3]])
do {
var a = Matrix(
[1.5,3.9],
[5.8, 3.2],
)
assert_eq(
a.ceil,
Matrix(
[2, 4],
[6, 4],
)
)
assert_eq(
a.floor,
Matrix(
[1,3],
[5,3],
)
)
assert_eq(a.sum, 14.4)
assert_eq(a.prod, 108.576)
assert_eq(a.sum { _**2 }, 61.34)
assert_eq(a.prod { _**2 }, 108.576**2)
}
say "** Test passed!"