changeset 465:c8b59d379cab

Add diagonal
author Chris Cannam
date Fri, 25 Oct 2013 14:37:09 +0100
parents 1fc64add2961
children 604a93b0b24d
files src/may/matrix.yeti src/may/matrix/test/test_matrix.yeti
diffstat 2 files changed, 22 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/may/matrix.yeti	Fri Oct 25 11:52:19 2013 +0100
+++ b/src/may/matrix.yeti	Fri Oct 25 14:37:09 2013 +0100
@@ -134,6 +134,8 @@
     SparseCSC data: fromSlice col row data;
     esac;
 
+//!!! better as getXx or just xx?
+
 getColumn j m =
     case m of
     DenseCols cols: cols[j];
@@ -148,6 +150,12 @@
     _: vec.fromList (map do j: at' m i j done [0..width m - 1]);
     esac;
 
+getDiagonal k m =
+   (ioff = if k < 0 then -k else 0 fi;
+    joff = if k > 0 then  k else 0 fi;
+    n = min (width m - joff) (height m - ioff);
+    vec.fromList (map do i: at' m (i + ioff) (i + joff) done [0..n - 1]));
+
 asRows m =
     map do i: getRow i m done [0 .. (height m) - 1];
 
@@ -751,6 +759,11 @@
             fi
     fi);
 
+//!!! todo: look at all occurrences of matrix (and complexmatrix)
+// construction and make sure we have good apis for those use cases.
+// in particular, constructing from literal data (list<list<number>>)
+// is much too hard at the moment.
+
 {
     size,
     width,
@@ -760,6 +773,7 @@
     at = at',
     getColumn,
     getRow,
+    getDiagonal,
     isRowMajor?,
     isSparse?,
     generate,
@@ -811,6 +825,7 @@
     at is matrix -> number -> number -> number,
     getColumn is number -> matrix -> vector,
     getRow is number -> matrix -> vector,
+    getDiagonal is number -> matrix -> vector,
     isRowMajor? is matrix -> boolean,
     isSparse? is matrix -> boolean,
     generate is (number -> number -> number) -> { .rows is number, .columns is number } -> matrix,
--- a/src/may/matrix/test/test_matrix.yeti	Fri Oct 25 11:52:19 2013 +0100
+++ b/src/may/matrix/test/test_matrix.yeti	Fri Oct 25 14:37:09 2013 +0100
@@ -186,6 +186,13 @@
         and compareMatrices m m''';
 ),
 
+"diagonal-\(name)": \(
+    m = newMatrix (RowMajor ()) [[1,4],[0,5],[3,6]];
+    compare (vec.list (mat.getDiagonal 0 m)) [1,5] and
+        compare (vec.list (mat.getDiagonal 1 m)) [4] and
+        compare (vec.list (mat.getDiagonal (-1) m)) [0,6]
+),
+
 "scaled-\(name)": \(
     compareMatrices
        (mat.scaled 0.5 (constMatrix 2 { rows = 3, columns = 4 }))