Mercurial > hg > may
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 }))