diff options
author | Camil Staps | 2016-10-11 12:29:53 +0000 |
---|---|---|
committer | Camil Staps | 2016-10-11 12:29:53 +0000 |
commit | dac20e1e41bbe12b178870d368e7fc56fc12815b (patch) | |
tree | 8250447fc2ff0716c87aaa537bfeb0f5640532c2 /mulmat.icl | |
parent | Initial commit (diff) |
Added simple examples
Diffstat (limited to 'mulmat.icl')
-rw-r--r-- | mulmat.icl | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/mulmat.icl b/mulmat.icl new file mode 100644 index 0000000..dbf1bad --- /dev/null +++ b/mulmat.icl @@ -0,0 +1,84 @@ +module mulmat + +/* +Matrix Multiplication. + +This program performs matrix multiplication on matrices of integers. +Lists are used to simulate matrices +The initial matrices (Mat1 & Mat2) can have arbitrary size (Size). The +second matrix is transposed first, in order to avoid traversing a matrix +by column, which is very inefficient. The result of the program shows the +initial matrices and the resulting matrix. Run the program with the +"Show Constructors" option on (Application Options). +*/ + +import StdInt, StdString + +::Row :== [Int] // A row is a list of integers. +::Col :== [Int] // A column is a list of integers. +::Mat :== [Row] // A matrix is a list of rows. +::TMat :== [Col] // A transposed matrix is a list of columns. +::Index_new :== Int // An index is an integer. + +Size :== 6 // The size of the matrices. + +// The initial matrices + +Mat1::Mat +Mat1 = [[ 1, 2, 3, 4, 5, 6 ] // + ,[ 0, 1, 2, 3, 4, 5 ] // + ,[ -1, 0, 1, 2, 3, 4 ] // The product of these matrices: + ,[ -2,-1, 0, 1, 2, 3 ] // + ,[ -3,-2,-1, 0, 1, 2 ] // + ,[ -4,-3,-2,-1, 0, 1 ]] // [ 0 -9 0 5 1 7 ] + // [ 0 -8 -1 4 1 6 ] +Mat2::Mat // [ 0 -7 -2 3 1 5 ] +Mat2 = [[ 0, 1, 0, 0, 0,-1 ] // [ 0 -6 -3 2 1 4 ] + ,[ 1, 0, 1, 1, 0, 1 ] // [ 0 -5 -4 1 1 3 ] + ,[ -1, 0, 1,-1, 0, 0 ] // [ 0 -4 -5 0 1 2 ] + ,[ -1,-1,-1, 0,-1, 0 ] // + ,[ 1, 0, 1, 0, 1, 0 ] // + ,[ 0,-1,-1, 1, 0, 1 ]] // + + +// Multiplying two matrices. + +MulMat::Mat Mat -> Mat +MulMat m1 m2 = TMulMat m1 (Transpose m2) + +TMulMat::Mat TMat -> Mat +TMulMat [r] m2 = [ MulRow r m2 ] +TMulMat [r:rs] m2 = [ MulRow r m2 : TMulMat rs m2 ] + +MulRow::Row TMat -> Row +MulRow r [c] = [ Inprodukt r c ] +MulRow r [c:cs] = [ Inprodukt r c : MulRow r cs ] + +Inprodukt::Row Col -> Int +Inprodukt [] [] = 0 +Inprodukt [a:as] [b:bs] = a * b + Inprodukt as bs + +// Transposing a matrix. + +Transpose::Mat -> TMat +Transpose m = Transp m 1 + +Transp::Mat Index_new -> TMat +Transp m i | i == Size = [ Column m i ] + = [ Column m i : Transp m (i + 1) ] + +Column::Mat Index_new -> Col +Column [] i = [] +Column [r:rs] i = [ Select r i : Column rs i ] + +Select::Row Index_new -> Int +Select [a:as] 1 = a +Select [a:as] i = Select as (i - 1) + +// The Start rule: show the initial matrices and their product. + +Start::(Mat,String,Mat,String,Mat) +Start = (m1,"\ntimes\n",m2,"\nbecomes\n",MulMat m1 m2) +where + m1 = Mat1; m2 = Mat2 +
\ No newline at end of file |