# HG changeset patch # User Chris Cannam # Date 1383343957 0 # Node ID 9f87e8eb1e7e147bcab6f2e6470b73e84a4832c4 # Parent b70acc1d84d9b49b808a22e2f111d380b7662047# Parent b510661536a6c6ca9c11d8cb75bdfb6ed5cefd52 Merge from branch opaque_type_references diff -r b510661536a6 -r 9f87e8eb1e7e src/may/matrix/complex.yeti --- a/src/may/matrix/complex.yeti Fri Nov 01 21:45:02 2013 +0000 +++ b/src/may/matrix/complex.yeti Fri Nov 01 22:12:37 2013 +0000 @@ -42,6 +42,26 @@ esac; cpx.complex (partAt cm.real row col) (partAt cm.imaginary row col)); +enumerate cm = + (enhash h p proto ix = + (e = maybe [] mat.enumerate p; + for e do { i, j, v }: + key = { i, j }; + if not key in h then h[key] := proto (); fi; + h[key][ix] := v; + done); + h = [:]; + proto = \(array[0,0]); + enhash h cm.real proto 0; + enhash h cm.imaginary proto 1; + sortBy + do a b: + if a.i == b.i then a.j < b.j else a.i < b.i fi + done + (map do k: k with { v = cpx.complex h[k][0] h[k][1] } done + (keys h)) + ); + maybe' lambda f = // like maybe but with lazy default \case of Some v: f v; @@ -149,7 +169,7 @@ flipped cm = { - size = { rows = cm.size.columns, columns = cm.size.rows }, + size = { rows = cm.size.rows, columns = cm.size.columns }, real = maybe none (Some . mat.flipped) cm.real, imaginary = maybe none (Some . mat.flipped) cm.imaginary, }; @@ -241,19 +261,12 @@ imaginary = addParts (multiplyParts b c) (multiplyParts a d); }); +nonZeroValues cm = + fold do nnz { i, j, v }: if v != cpx.zero then nnz + 1 else nnz fi done + 0 (enumerate cm); + density cm = - case cm.real of - Some m1: - case cm.imaginary of - Some m2: (mat.density m1 + mat.density m2) / 2; - none: mat.density m1; - esac; - none: - case cm.imaginary of - Some m2: mat.density m2; - none: 0.0; - esac; - esac; + (nonZeroValues cm) / (width cm * height cm); newComplexMatrix type data = (newPart f = @@ -269,31 +282,12 @@ (newPart f = mat.newColumnVector (vec.fromList (map f data)); complex (newPart cpx.real) (newPart cpx.imaginary)); -enumerate cm = - (enhash h p proto ix = - (e = maybe [] mat.enumerate p; - for e do { i, j, v }: - key = { i, j }; - if not key in h then h[key] := proto (); fi; - h[key][ix] := v; - done); - h = [:]; - proto = \(array[0,0]); - enhash h cm.real proto 0; - enhash h cm.imaginary proto 1; - sortBy - do a b: - if a.i == b.i then a.j < b.j else a.i < b.i fi - done - (map do k: k with { v = cpx.complex h[k][0] h[k][1] } done - (keys h)) - ); - { size, width, height, density, + nonZeroValues, at, getColumn, getRow, @@ -330,6 +324,7 @@ width is complexmatrix -> number, height is complexmatrix -> number, density is complexmatrix -> number, + nonZeroValues is complexmatrix -> number, at is complexmatrix -> number -> number -> cpx.complex_t, getColumn is number -> complexmatrix -> array, getRow is number -> complexmatrix -> array, diff -r b510661536a6 -r 9f87e8eb1e7e src/may/matrix/test/test_complexmatrix.yeti --- a/src/may/matrix/test/test_complexmatrix.yeti Fri Nov 01 21:45:02 2013 +0000 +++ b/src/may/matrix/test/test_complexmatrix.yeti Fri Nov 01 22:12:37 2013 +0000 @@ -8,6 +8,13 @@ { compare, compareUsing } = load may.test.test; +aTestMatrix () = + (// 1+0i 0-2i 3.5+6i + // 0+0i 4-3i 1-0.2i + reals = mat.newMatrix (RowMajor ()) (map vec.fromList [[1,0,3.5],[0,4,1]]); + imags = mat.newMatrix (RowMajor ()) (map vec.fromList [[0,-2,6],[0,-3,-0.2]]); + cm.complex reals imags); + [ "enumerate": \( @@ -36,7 +43,28 @@ (sortEntries e) (sortEntries all); ), - + +"transposed": \( + m = aTestMatrix (); + mout = cm.transposed m; + compare (map vec.list (mat.asRows (cm.real mout))) [[1,0],[0,4],[3.5,1]] and + compare (map vec.list (mat.asRows (cm.imaginary mout))) [[0,0],[-2,-3],[6,-0.2]]; +), + +"conjugateTransposed": \( + m = aTestMatrix (); + mout = cm.conjugateTransposed m; + compare (map vec.list (mat.asRows (cm.real mout))) [[1,0],[0,4],[3.5,1]] and + compare (map vec.list (mat.asRows (cm.imaginary mout))) [[0,0],[2,3],[-6,0.2]]; +), + +"flipped": \( + m = aTestMatrix (); + mout = cm.flipped m; + compare (map vec.list (mat.asRows (cm.real mout))) [[1,0,3.5],[0,4,1]] and + compare (map vec.list (mat.asRows (cm.imaginary mout))) [[0,-2,6],[0,-3,-0.2]]; +), + "magnitudes": \( // 1+0i 0-2i // 0+0i 4-3i @@ -46,6 +74,33 @@ mags = cm.magnitudes m; compare (map vec.list (mat.asRows mags)) [[1,2],[0,5]]; ), + +"magnitudes-real": \( + reals = mat.newMatrix (RowMajor ()) (map vec.fromList [[1,0],[0,4]]); + m = cm.fromReal reals; + mags = cm.magnitudes m; + compare (map vec.list (mat.asRows mags)) (map vec.list (mat.asRows reals)); +), + +"magnitudes-imag": \( + reals = mat.newMatrix (RowMajor ()) (map vec.fromList [[1,0],[0,4]]); + m = cm.fromImaginary reals; + mags = cm.magnitudes m; + compare (map vec.list (mat.asRows mags)) (map vec.list (mat.asRows reals)); +), + +"density": \( + // 1+0i 0-2i + // 0+0i 4-3i + reals = mat.newMatrix (RowMajor ()) (map vec.fromList [[1,0],[0,4]]); + imags = mat.newMatrix (RowMajor ()) (map vec.fromList [[0,-2],[0,-3]]); + compare (cm.density (cm.complex reals imags)) 0.75 and + compare (cm.nonZeroValues (cm.complex reals imags)) 3 and + compare (cm.density (cm.fromReal reals)) 0.5 and + compare (cm.nonZeroValues (cm.fromReal reals)) 2 and + compare (cm.density (cm.fromImaginary imags)) 0.5 and + compare (cm.nonZeroValues (cm.fromImaginary imags)) 2 +), "angles": \( // 1+0i 0-2i