======== #1 matrix.rotation() ========

matrix.rotation(math.pi / 6) .. @@{{0.866025, -0.5}, {0.5, 0.866025}}
matrix.rotation(30):deg .. @@{{0.866025, -0.5}, {0.5, 0.866025}}
matrix.rotation@x(math.pi / 6) .. @@{{1, 0, 0}, {0, 0.866025, -0.5}, {0, 0.5, 0.866025}}
matrix.rotation@x(30):deg .. @@{{1, 0, 0}, {0, 0.866025, -0.5}, {0, 0.5, 0.866025}}
matrix.rotation@y(math.pi / 6) .. @@{{0.866025, 0, 0.5}, {0, 1, 0}, {-0.5, 0, 0.866025}}
matrix.rotation@y(30):deg .. @@{{0.866025, 0, 0.5}, {0, 1, 0}, {-0.5, 0, 0.866025}}
matrix.rotation@z(math.pi / 6) .. @@{{0.866025, -0.5, 0}, {0.5, 0.866025, 0}, {0, 0, 1}}
matrix.rotation@z(30):deg .. @@{{0.866025, -0.5, 0}, {0.5, 0.866025, 0}, {0, 0, 1}}
matrix.rotation(math.pi / 6, 11, 22) .. @@{{0.866025, -0.5, 11}, {0.5, 0.866025, 22}, {0, 0, 1}}
matrix.rotation@x(math.pi / 6, 11, 22, 33) .. @@{{1, 0, 0, 11}, {0, 0.866025, -0.5, 22}, {0, 0.5, 0.866025, 33}, {0, 0, 0, 1}}
matrix.rotation@y(math.pi / 6, 11, 22, 33) .. @@{{0.866025, 0, 0.5, 11}, {0, 1, 0, 22}, {-0.5, 0, 0.866025, 33}, {0, 0, 0, 1}}
matrix.rotation@z(math.pi / 6, 11, 22, 33) .. @@{{0.866025, -0.5, 0, 11}, {0.5, 0.866025, 0, 22}, {0, 0, 1, 33}, {0, 0, 0, 1}}

======== #2 ========

3 * @@ { { 1, -3 }, { 2, -4 } } - 2 * @@ { { 5, 6 }, { 7, 3 } } .. @@{{-7, -21}, {-8, -18}}
@@ { { 1, -3 }, { 2, -4 } } * 3 - @@ { { 5, 6 }, { 7, 3 } } * 2 .. @@{{-7, -21}, {-8, -18}}
2 * @@ { { 1, -2, -3 }, { 5, 3, 2 }, { 2, 0, -1 } } - 3 * @@ { { 4, 2, -3 }, { 5, 3, -2 }, { 3, 4, 1 } } .. @@{{-10, -10, 3}, {-5, -3, 10}, {-5, -12, -5}}
matrix.dot(@@ { { 1, 2 }, { 3, 1 } }, [1, 2]) .. [5, 5]
matrix.dot(@@ { { 1, 3 }, { 2, 4 } }, @@ { { 4, 1 }, { 3, 2 } }) .. @@{{13, 7}, {20, 10}}
matrix.dot(@@ { { 4, 1 }, { 3, 2 } }, @@ { { 1, 3 }, { 2, 4 } }) .. @@{{6, 16}, {7, 17}}
matrix.dot([1, 0, 2], @@ { { 1, 0, 1 }, { 2, 1, 0 }, { 0, 0, 2 } }) .. [1, 0, 5]
matrix.dot(@@ { { 1, 0, 0 }, { -2, -1, 0 }, { 0, 1, 1 } }, @@ { { 1, 0, 0 }, { -2, -1, 0 }, { 0, 1, 1 } }) .. @@{{1, 0, 0}, {0, 1, 0}, {-2, 0, 1}}
@@ { { 1, -1, -2 }, { 2, -1, 5 }, { 1, -1, -1 } }.invert() .. @@{{6, 1, -7}, {7, 1, -9}, {-1, 0, 1}}
@@ { { -2, -3, -2 }, { 1, 1, 1 }, { 2, 2, 1 } }.invert() .. @@{{1, 1, 1}, {-1, -2, 0}, {0, 2, -1}}

======== #3 ========

matrix.identity(1) .. 1
matrix.identity(2) .. @@{{1, 0}, {0, 1}}
matrix.identity(3) .. @@{{1, 0, 0}, {0, 1, 0}, {0, 0, 1}}
matrix.identity(10) .. @@{{1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 1, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 1, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 1, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 1, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 1, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 1, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 1, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 1, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 1}}

======== #4 ========

8,3,3,6,3,8,0,4,8,6
6,3,4,5,3,1,3,3,9,9
4,1,2,5,1,0,0,7,5,4
7,5,2,5,7,3,2,5,5,0
5,2,6,7,4,1,8,8,1,3
8,8,4,2,3,3,6,9,9,7
1,2,2,2,2,4,7,6,4,9
0,2,9,8,9,6,2,9,6,0
4,9,4,5,2,5,7,5,5,7
8,9,5,3,5,1,8,4,6,6

8,6,4,7,5,8,1,0,4,8
3,3,1,5,2,8,2,2,9,9
3,4,2,2,6,4,2,9,4,5
6,5,5,5,7,2,2,8,5,3
3,3,1,7,4,3,2,9,2,5
8,1,0,3,1,3,4,6,5,1
0,3,0,2,8,6,7,2,7,8
4,3,7,5,8,9,6,9,5,4
8,9,5,5,1,9,4,6,5,6
6,9,4,0,3,7,9,0,7,6

======== #5 ========

f(@@ { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }) .. [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
f(@@ { { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 } }) .. [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
g(@@ { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }) .. [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
g(@@ { { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 } }) .. [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

======== #6 ========

a .. @@{{2, 1, 0, 4}, {2, 3, -1, 1}, {0, 1, 4, -1}}
a.each():list .. [2, 1, 0, 4, 2, 3, -1, 1, 0, 1, 4, -1]
a.each():transpose:list .. [2, 2, 0, 1, 3, 1, 0, -1, 4, 4, 1, -1]
a.list() .. [[2, 1, 0, 4], [2, 3, -1, 1], [0, 1, 4, -1]]
a.list():transpose .. [[2, 2, 0], [1, 3, 1], [0, -1, 4], [4, 1, -1]]
a.eachrow():list .. [[2, 1, 0, 4], [2, 3, -1, 1], [0, 1, 4, -1]]
a.eachcol():list .. [[2, 2, 0], [1, 3, 1], [0, -1, 4], [4, 1, -1]]

======== #7 ========

a .. @@{{2, 1, 0, 4}, {2, 3, -1, 1}, {0, 1, 4, -1}}
b .. @@{{2, 0, 1, 2}, {-1, 1, 3, 1}, {0, -2, 1, -1}}
a + b .. @@{{4, 1, 1, 6}, {1, 4, 2, 2}, {0, -1, 5, -2}}
a - 2 * b .. @@{{-2, 1, -2, 0}, {4, 1, -7, -1}, {0, 5, 2, 1}}
(-(3 * a)) + 2 * b .. @@{{-2, -3, 2, -8}, {-8, -7, 9, -1}, {0, -7, -10, 1}}

======== #8 ========

matrix.dot(@@ { { 3, 2, 1 } }, [1, 0, -3]) .. 0
matrix.dot([-1, 1], @@ { { 4, -3 }, { -5, 2 } }) .. [-9, 5]
matrix.dot(@@ { { -1, 2, -3 }, { 0, 1, 4 } }, @@ { { 3, 1 }, { 0, 2 } }) .. ValueError: matrix size mismatches
matrix.dot(@@ { { -1, 2, 0 }, { 4, 0, -2 } }, @@ { { 1, 2, 0 }, { -1, 1, 3 }, { 5, 1, -1 } }) .. @@{{-3, 0, 6}, {-6, 6, 2}}

======== #9 ========

mat .. @@{{2, 5}, {1, 4}}
mat.invert().roundoff() .. @@{{1.33333, 0}, {0, 0.666667}}
matrix.dot(mat.invert(), mat).roundoff() .. @@{{1, 0}, {0, 1}}
mat .. @@{{2, 5, -1}, {1, 3, 1}, {3, -1, -2}}
mat.invert().roundoff() .. @@{{0, 0.44, 0.32}, {0.2, 0, 0}, {0, 0.68, 0.04}}
matrix.dot(mat.invert(), mat).roundoff() .. @@{{1, 0, 0}, {0, 1, 0}, {0, 0, 1}}
mat .. @@{{1, 1, 0}, {2, 3, -1}, {0, 1, 0}}
mat.invert().roundoff() .. @@{{1, 0, 0}, {0, 0, 1}, {2, 0, 1}}
matrix.dot(mat.invert(), mat).roundoff() .. @@{{1, 0, 0}, {0, 1, 0}, {0, 0, 1}}
mat .. @@{{1, 3, 2}, {2, 8, 9}, {4, 13, 11}}
mat.invert().roundoff() .. @@{{0, 0, 11}, {14, 3, 0}, {0, 0, 2}}
matrix.dot(mat.invert(), mat).roundoff() .. @@{{1, 0, 0}, {0, 1, 0}, {0, 0, 1}}
mat .. @@{{1, 3, 3}, {-1, 1, 4}, {1, 2, 1}}
mat.invert().roundoff() .. @@{{7, 0, 0}, {0, 2, 7}, {3, 0, 0}}
matrix.dot(mat.invert(), mat).roundoff() .. @@{{1, 0, 0}, {0, 1, 0}, {0, 0, 1}}
mat .. @@{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}
mat.invert().roundoff() .. ValueError: failed to calculate inverted matrix
matrix.dot(mat.invert(), mat).roundoff() .. ValueError: failed to calculate inverted matrix
mat .. @@{{2, 1, 3}, {4, 5, 4}, {3, 1, 5}}
mat.invert().roundoff() .. @@{{21, 0, 0}, {0, 1, 4}, {0, 1, 6}}
matrix.dot(mat.invert(), mat).roundoff() .. @@{{1, 0, 0}, {0, 1, 0}, {0, 0, 1}}
mat .. @@{{1, 0, 1}, {2, 2, 3}, {1, -1, 1}}
mat.invert().roundoff() .. @@{{5, 0, 0}, {1, 0, 0}, {0, 1, 2}}
matrix.dot(mat.invert(), mat).roundoff() .. @@{{1, 0, 0}, {0, 1, 0}, {0, 0, 1}}
mat .. @@{{2, 1, 0}, {1, -1, 2}, {-1, 0, -1}}
mat.invert().roundoff() .. @@{{1, 1, 2}, {0, 0, 0}, {0, 0, 0}}
matrix.dot(mat.invert(), mat).roundoff() .. @@{{1, 0, 0}, {0, 1, 0}, {0, 0, 1}}
mat .. @@{{2, 3, 1}, {1, 1, 0}, {1, -1, -1}}
mat.invert().roundoff() .. @@{{1, 0, 1}, {0, 3, 0}, {2, 0, 1}}
matrix.dot(mat.invert(), mat).roundoff() .. @@{{1, 0, 0}, {0, 1, 0}, {0, 0, 1}}
mat .. @@{{1, 2, 1, 2}, {-1, -1, 0, -1}, {-2, -1, 2, 0}, {2, 6, 1, 4}}
mat.invert().roundoff() .. @@{{5, 6, 0, 0}, {2, 4, 0, 0}, {6, 8, 0, 0}, {0, 0, 3, 1}}
matrix.dot(mat.invert(), mat).roundoff() .. @@{{1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, 0}, {0, 0, 0, 1}}
mat .. @@{{1, 0, -1, 2}, {2, 1, 1, 0}, {-1, -1, -1, 1}, {1, 2, 2, -2}}
mat.invert().roundoff() .. @@{{0, 0, 0, 0}, {1, 0, 0, 1}, {0, 2, 4, 1}, {0, 1, 3, 1}}
matrix.dot(mat.invert(), mat).roundoff() .. @@{{1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, 0}, {0, 0, 0, 1}}
matrix.dot(@@ { { 2, 1, 3 }, { 4, 5, 4 }, { 3, 1, 5 } }.invert(), [0, -2, 1]) .. [-7, 2, 4]

======== #10 ========

m .. @@{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}
m.col([0, 1, 2]) .. [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
m.row([0, 1, 2]) .. [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

======== #11 ========

-a .. @@{{-2, -1, -1}, {0, -2, 1}, {-3, 0, -2}}
a + b .. @@{{3, 2, 1}, {0, 1, 0}, {4, 0, 1}}
a - b .. @@{{1, 0, 1}, {0, 3, -2}, {2, 0, 3}}
matrix.dot(a, b) .. @@{{3, 1, 0}, {-1, -2, 3}, {5, 3, -2}}
repeat (3):list {|row| repeat (3):list {|col| (a_list[row] * b_list::get(col)).sum() } } .. [[3, 1, 0], [-1, -2, 3], [5, 3, -2]]
2 * a + 3 * b .. @@{{7, 5, 2}, {0, 1, 1}, {9, 0, 1}}
matrix.dot(a, b) .. ValueError: matrix size mismatches
matrix.dot(a, c) .. @@{{2, 5, 5}, {-2, 2, 1}, {2, 2, 0}}
matrix.dot(b, a) .. @@{{5, 2, -3, 4}, {-1, 0, 3, 3}, {0, -3, 3, 3}}
matrix.dot(b, c) .. ValueError: matrix size mismatches
matrix.dot(c, a) .. @@{{1, -2, 3, 5}, {2, 1, -1, 2}, {-1, -2, 1, -1}, {2, -1, -1, 1}}
a .. @@{{0.866025, -0.5}, {0.5, 0.866025}}
b .. @@{{0.5, -0.866025}, {0.866025, 0.5}}
matrix.dot(b, a).roundoff() .. @@{{0, 0}, {1, 0}}
matrix.dot(a, b).roundoff() .. @@{{0, 0}, {1, 0}}

======== #12 ========

m .. @@{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}
m[0] .. @@{{1, 2, 3}}
m[1] .. @@{{4, 5, 6}}
m[2] .. @@{{7, 8, 9}}
m[0, 1, 2] .. [@@{{1, 2, 3}}, @@{{4, 5, 6}}, @@{{7, 8, 9}}]
m[0..] .. [@@{{1, 2, 3}}, @@{{4, 5, 6}}, @@{{7, 8, 9}}]
m[][0] .. @@{1, 4, 7}
m[][1] .. @@{2, 5, 8}
m[][2] .. @@{3, 6, 9}
m[][0, 1, 2] .. [@@{1, 4, 7}, @@{2, 5, 8}, @@{3, 6, 9}]
m[][0..] .. [@@{1, 4, 7}, @@{2, 5, 8}, @@{3, 6, 9}]
m[0][0] .. 1
m[1][1] .. 5
m[2][2] .. 9
m.list() .. [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
m.list():transpose .. [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
m.list():flat .. [1, 2, 3, 4, 5, 6, 7, 8, 9]
m.list():transpose:flat .. [1, 4, 7, 2, 5, 8, 3, 6, 9]
m .. @@{{0, 1, 2, 3, 4, 5}, {6, 7, 8, 9, 0, 1}, {2, 3, 4, 5, 6, 7}, {8, 9, 0, 1, 2, 3}, {4, 5, 6, 7, 8, 9}, {0, 1, 2, 3, 4, 5}}
m .. @@{{1, 1, 1, 1, 1, 1}, {6, 7, 8, 9, 0, 1}, {2, 3, 4, 5, 6, 7}, {8, 9, 0, 1, 2, 3}, {4, 5, 6, 7, 8, 9}, {0, 1, 2, 3, 4, 5}}
m .. @@{{1, 1, 1, 1, 1, 1}, {6, 1, 8, 9, 0, 1}, {2, 1, 4, 5, 6, 7}, {8, 1, 0, 1, 2, 3}, {4, 1, 6, 7, 8, 9}, {0, 1, 2, 3, 4, 5}}

======== #13 matrix.scale() ========

matrix.scale(3, -2) .. @@{{3, 0, 0}, {0, -2, 0}, {0, 0, 1}}
matrix.scale(3, -2, 5) .. @@{{3, 0, 0, 0}, {0, -2, 0, 0}, {0, 0, 5, 0}, {0, 0, 0, 1}}

======== #14 matrix.translate() ========

matrix.translate(3, -2) .. @@{{1, 0, 3}, {0, 1, -2}, {0, 0, 1}}
matrix.translate(3, -2, 5) .. @@{{1, 0, 0, 3}, {0, 1, 0, -2}, {0, 0, 1, 5}, {0, 0, 0, 1}}
