Matrixes¶
A matrix is a list in which all items are lists with the same count. Matrix ‘cells’ can be indexed by row and column.
q)show m:(0 1 2 3;4 5 6 7;8 9 10 11)
0 1 2 3
4 5 6 7
8 9 10 11
q)m[2;1]
9
shape:{$[0=d:depth x;
0#0j;
d#{first raze over x}each(d{each[x;]}\count)@\:x]}
Apply to dimension 1 function defined on dimension 0¶
q)x:3 4#1+!12
q)sum x
15 18 21 24
q)sum each x
10 26 42
Constructors¶
Truth table of order x¶
q)tt:{2 vs til "j"$2 xexp x}
q)tt 1
0 1
q)tt 2
0 0 1 1
0 1 0 1
q)tt 3
0 0 0 0 1 1 1 1
0 0 1 1 0 0 1 1
0 1 0 1 0 1 0 1
Upper triangular matrix of order x¶
q)x:5
q){x<=\:x}til x
11111b
01111b
00111b
00011b
00001b
Lower triangular matrix of order x¶
q){x>=\:x}til 5
10000b
11000b
11100b
11110b
11111b
Tests: Is x lower or upper triangular?
Identity matrix of order x¶
q)id:{(2#x)#1,x#0}
q)id 5
1 0 0 0 0
0 1 0 0 0
0 0 1 0 0
0 0 0 1 0
0 0 0 0 1
q){x=/:x}til 5
10000b
01000b
00100b
00010b
00001b
Hilbert matrix of order x¶
q)hm:{reciprocal 1+(til x)+/:til x}
q)hm 5
1 0.5 0.3333333 0.25 0.2
0.5 0.3333333 0.25 0.2 0.1666667
0.3333333 0.25 0.2 0.1666667 0.1428571
0.25 0.2 0.1666667 0.1428571 0.125
0.2 0.1666667 0.1428571 0.125 0.1111111
Empty row to start matrix of x columns¶
Ancestor languages of q in which all arrays are rectangular, such as APL, use a zero-row matrix as a ‘template’ to which rows can be joined. In q this would look like
q)(0 4#" "),5 4#.Q.a
'length
[0] (0 4#" "),5 4#.Q.a
^
q)0 4#" "
'length
[0] 0 4#" "
^
but q does not require zero-row matrixes with a defined number of columns, nor allow their definition.
q)(),5 4#.Q.a
"abcd"
"efgh"
"ijkl"
"mnop"
"qrst"
Diagonals¶
Main diagonal¶
q)show x:3 4#1+til 12
1 2 3 4
5 6 7 8
9 10 11 12
q)show y:2#'tc x
0 0
1 1
2 2
q)x ./:y
1 6 11
q)x ./:2#'tc x
1 6 11
Diagonals from columns¶
q)show x:5 5 #1+til 25
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25
q)(neg til 5)rotate'x
1 2 3 4 5
10 6 7 8 9
14 15 11 12 13
18 19 20 16 17
22 23 24 25 21
Columns from diagonals¶
q)x:(1 2 3 4 5;10 6 7 8 9;14 15 11 12 13;18 19 20 16 17;22 23 24 25 21)
q)(til 5)rotate'x
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25
Add vector y to main diagonal of x¶
q)show x:3 4#til 12
0 1 2 3
4 5 6 7
8 9 10 11
q)y:10 100 1000
q)@'[x;tc x;+;y]
10 1 2 3
4 105 6 7
8 9 1010 11
The @'
above can be analysed as three Amends:
q)(@[x 0;0;+;y 0];@[x 1;1;+;y 1];@[x 2;2;+;y 2])
10 1 2 3
4 105 6 7
8 9 1010 11
Extend distance table to next leg¶
q)show x:(0 50 80 20 999; 50 0 20 40 30; 80 20 0 999 30; 20 40 999 0 10; 999 30 30 10 0)
0 50 80 20 999
50 0 20 40 30
80 20 0 999 30
20 40 999 0 10
999 30 30 10 0
Notice x[0;2]
is 80
while x[0;1]+x[1;2]
is 70
.
q)x('[min;+])\:x / x{min x+y}\:x
0 50 70 20 30
50 0 20 40 30
70 20 0 40 30
20 40 40 0 10
30 30 30 10 0
Extend a transitive binary relation¶
q)show x:(0 1 0 0;0 0 1 1;1 0 0 0;0 0 1 0)
0 1 0 0
0 0 1 1
1 0 0 0
0 0 1 0
q)x('[max;&])\:x
0 0 1 1
1 0 1 0
0 1 0 0
1 0 0 0
q)x('[any;&])\:x / x{any x&y}\:x
0011b
1010b
0100b
1000b
First column as a matrix¶
q)show x:3 4#til 12
0 1 2 3
4 5 6 7
8 9 10 11
q)x[;enlist 0]
0
4
8
Value of two-by-two determinant¶
q)x:(13 21;34 55)
q)(-)over(x 0)*reverse x 1
1
Shur sum¶
q)show x:3 2#til 6
1 2
3 4
5 6
q)show y:2 4#1+til 8
1 2 3 4
5 6 7 8
q)((last shape x)#x) + (first shape y)#'y
2 4
8 10
Shur product¶
q)show x:3 2#til 6
1 2
3 4
5 6
q)show y:2 4#1+til 8
1 2 3 4
5 6 7 8
q)((last shape x)#x) * (first shape y)#'y
1 4
15 24