3 type vec = array of int
4 type vector = {dim : int, d : vec}
6 type mat = array of vector
7 type matrix = {x : int, y : int, d : mat}
9 function vectorCreate(n : int) : vector =
10 vector{dim = n, d = vec[n] of 0}
12 function vectorLiftedAdd(X : vector, Y : vector) : vector =
13 let var tmp : vector := vectorCreate(X.dim)
14 in for i := 0 to X.dim do
15 tmp.d[i] := X.d[i] + Y.d[i];
19 function vectorLiftedMul(X : vector, Y : vector) : vector =
20 let var tmp : vector := vectorCreate(X.dim)
21 in for i := 0 to X.dim do
22 tmp.d[i] := X.d[i] * Y.d[i];
26 function vectorInProduct(X : vector, Y : vector) : int =
27 let var tmp : int := 0
28 in for i := 0 to X.dim do
29 tmp := tmp + X.d[i] * Y.d[i];
35 function matrixCreate(n : int, m : int) : matrix =
36 let var tmp := matrix{x = n, y = m, d = mat[n] of nil}
38 tmp.d[i] := vectorCreate(m);
42 function matrixRow(A : matrix, i : int) : vector =
45 function matrixCol(A : matrix, j : int) : vector =
46 let var tmp := vectorCreate(A.y)
47 in for i := 0 to A.y do
48 tmp.d[i] := A.d[i].d[j];
52 function matrixTranspose(A : matrix) : matrix =
53 let var tmp := matrixCreate(A.y, A.x)
54 in for i := 0 to A.x do
56 tmp.d[j].d[i] := A.d[i].d[j];
60 function matrixLiftedAdd(A : matrix, B : matrix) : matrix =
61 let var tmp := matrixCreate(A.x, A.y)
62 in if A.x <> B.x | A.y <> B.y then exit(1)
63 else for i := 0 to A.x do
65 tmp.d[i].d[j] := A.d[i].d[j] + B.d[i].d[j];
69 function matrixLiftedMul(A : matrix, B : matrix) : matrix =
70 let var tmp := matrixCreate(A.x, A.y)
71 in if A.x <> B.x | A.y <> B.y then exit(1)
72 else for i := 0 to A.x do
74 tmp.d[i].d[j] := A.d[i].d[j] * B.d[i].d[j];
78 function matrixMul(A : matrix, B : matrix) : matrix =
79 let var tmp := matrixCreate(A.x, B.y)
80 in if A.y <> B.x then exit(1)
81 else for i := 0 to A.x do
83 tmp.d[i].d[j] := vectorInProduct(matrixRow(A,i), matrixCol(B,j));
87 function createDiagMat(X : vector) : matrix =
88 let var tmp := matrixCreate(X.dim, X.dim)
89 in for i := 0 to X.dim do
90 tmp.d[i].d[i] := X.d[i];
94 /* matrixMul(A, B) where B is a diagonal matrix, which can be represented
98 function matrixMulDiag(A : matrix, X : vector) : matrix =
99 let var tmp := matrixCreate(A.x, A.y)
100 in if A.y <> X.dim then exit(1)
101 else for i := 0 to A.x do
103 tmp.d[i].d[j] := A.d[i].d[j] * X.d[j];
107 /* Challenge: matrixMul(A, createDiagMat(X)) == matrixMulDiag(A, X)
108 i.e., derive the rhs from the lhs by specialization
110 What are the laws involved?
112 Challenge: matrixMul(A, create5shapeMatrix(a,b,c,d,e)) == efficient algorithm
118 /* matrixLiftedAdd(matrixCreate(8),matrixCreate(8)) */
120 matrixMul(A, createDiagMat(X))