# HG changeset patch # User Chris Cannam # Date 1382708229 -3600 # Node ID c8b59d379cab7c8c5ccd345add726cd090bf2168 # Parent 1fc64add296184e38d0ef235fa028b005747ad68 Add diagonal diff -r 1fc64add2961 -r c8b59d379cab src/may/matrix.yeti --- 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>) +// 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, diff -r 1fc64add2961 -r c8b59d379cab src/may/matrix/test/test_matrix.yeti --- 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 }))