changeset 550:5d6aeb765804

tiledTo
author Chris Cannam
date Tue, 25 Mar 2014 10:32:01 +0000
parents 0905242b46cb
children 25800b390b07 f20297bca167
files src/may/matrix.yeti src/may/matrix/test/test_matrix.yeti
diffstat 2 files changed, 59 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/src/may/matrix.yeti	Mon Mar 24 12:14:38 2014 +0000
+++ b/src/may/matrix.yeti	Tue Mar 25 10:32:01 2014 +0000
@@ -40,6 +40,8 @@
 
 module may.matrix;
 
+{ ceil } = load may.mathmisc;
+
 vec = load may.vector;
 
 load yeti.experimental.json;
@@ -897,13 +899,37 @@
             fi
     fi);
 
+//!!! doc: always dense
 repeatedHorizontal n m =
-   (cols = asColumns m;
-    fromColumns (fold do acc _: acc ++ cols done [] [1..n]));
+   (if n == 1 then m
+    else
+        cols = asColumns m;
+        fromColumns (fold do acc _: acc ++ cols done [] [1..n])
+    fi);
 
+//!!! doc: always dense
 repeatedVertical n m =
-   (rows = asRows m;
-    fromRows (fold do acc _: acc ++ rows done [] [1..n]));
+   (if n == 1 then m
+    else
+        rows = asRows m;
+        fromRows (fold do acc _: acc ++ rows done [] [1..n])
+    fi);
+
+//!!! doc: always dense
+tiledTo newsize m =
+    if newsize == size m then
+        m
+    elif (height m) == 0 or (width m) == 0 then
+        zeroMatrixWithTypeOf m newsize;
+    else    
+        h = ceil (newsize.columns / (width m));
+        v = ceil (newsize.rows / (height m));
+        if isRowMajor? m then
+            resizedTo newsize (repeatedHorizontal h (repeatedVertical v m))
+        else
+            resizedTo newsize (repeatedVertical v (repeatedHorizontal h m))
+        fi
+    fi;
 
 minValue m =
     if width m == 0 or height m == 0 then 0
@@ -994,6 +1020,7 @@
     entryWiseProduct,
     entryWiseDivide,
     resizedTo,
+    tiledTo,
     repeatedHorizontal,
     repeatedVertical,
     concatHorizontal,
@@ -1057,6 +1084,7 @@
     entryWiseProduct is list?<matrix_t> -> matrix_t,
     entryWiseDivide is matrix_t -> matrix_t -> matrix_t,
     resizedTo is { rows is number, columns is number } -> matrix_t -> matrix_t,
+    tiledTo is { rows is number, columns is number } -> matrix_t -> matrix_t,
     repeatedHorizontal is number -> matrix_t -> matrix_t,
     repeatedVertical is number -> matrix_t -> matrix_t,
     concatHorizontal is list<matrix_t> -> matrix_t,
--- a/src/may/matrix/test/test_matrix.yeti	Mon Mar 24 12:14:38 2014 +0000
+++ b/src/may/matrix/test/test_matrix.yeti	Tue Mar 25 10:32:01 2014 +0000
@@ -419,6 +419,33 @@
                (mat.toSparse (fromColumns [[1,4],[2,5],[3,6]])))
 ),
 
+"tiledTo-\(name)": \(
+    compareMatrices
+       (mat.tiledTo { rows = 2, columns = 2 }
+           (fromColumns [[1,4],[2,5],[3,6]]))
+       (fromColumns [[1,4],[2,5]]) and
+        compareMatrices
+           (mat.tiledTo { rows = 3, columns = 4 }
+               (fromColumns [[1,4],[2,5],[3,6]]))
+           (fromColumns [[1,4,1],[2,5,2],[3,6,3],[1,4,1]]) and
+        compareMatrices
+           (mat.tiledTo { rows = 7, columns = 2 }
+               (fromColumns [[1,4],[2,5],[3,6]]))
+           (fromColumns [[1,4,1,4,1,4,1],[2,5,2,5,2,5,2]]) and
+        compareMatrices
+           (mat.tiledTo { rows = 1, columns = 1 }
+               (fromColumns [[1,4],[2,5],[3,6]]))
+           (fromRows [[1]]) and
+        compareMatrices
+           (mat.tiledTo { rows = 2, columns = 3 }
+               (mat.zeroMatrix { rows = 0, columns = 0 }))
+           (fromRows [[0,0,0],[0,0,0]]) and
+        compareMatrices
+           (mat.tiledTo { rows = 0, columns = 0 }
+               (mat.zeroMatrix { rows = 4, columns = 3 }))
+           (fromRows [])
+),
+
 "zeroSizeMatrix-\(name)": \(
     compareMatrices
        (mat.zeroMatrix { rows = 0, columns = 0 })