Mercurial > hg > may
changeset 9:1c5b70c79859
Make mixedDown a bit less inefficient, add copy functions
author | Chris Cannam |
---|---|
date | Thu, 13 Dec 2012 10:35:23 +0000 |
parents | dc72a1d15901 |
children | 149d6911ca12 |
files | audiofile.yeti floatrix.yeti |
diffstat | 2 files changed, 29 insertions(+), 11 deletions(-) [+] |
line wrap: on
line diff
--- a/audiofile.yeti Wed Dec 12 22:22:02 2012 +0000 +++ b/audiofile.yeti Thu Dec 13 10:35:23 2012 +0000 @@ -82,7 +82,7 @@ readMono { format is ~AudioFormat, stream is ~AudioInputStream } n = (doubles = readInterleaved { format, stream } n; channels = format#getChannels(); - mat.mixedDown channels doubles; + mat.mixedDownFromInterleaved channels doubles; ); //!!! need to read only remaining, not whole stream length
--- a/floatrix.yeti Wed Dec 12 22:22:02 2012 +0000 +++ b/floatrix.yeti Thu Dec 13 10:35:23 2012 +0000 @@ -1,5 +1,7 @@ module floatrix; +import java.util: Arrays; + zeros n = new double[n]; ones n = (a = zeros n; for [0..n-1] do i: a[i] := 1.0 done; a); @@ -16,8 +18,7 @@ (m = zeroMatrix rows cols; for [0..rows-1] do row: for [0..cols-1] do col: - n = f row col; - m[row][col] := n; + m[row][col] := f row col; done; done; m); @@ -40,6 +41,10 @@ dimensions m = { cols = width m, rows = height m }; +copyOfVector v is ~double[] -> ~double[] = Arrays#copyOf(v, length(arrayWrap v)); + +copyOfMatrix m = array (map copyOfVector m); + transposed m is array<~double[]> -> array<~double[]> = generateMatrix do row col: m[col][row] done (cols m) (rows m); @@ -58,21 +63,34 @@ v[rows * col + row] done rows (length (arrayWrap v) / rows); - //!!! too inefficient! -mixedDown rows v is number -> ~double[] -> ~double[] = +mixedDown m = + (if empty? m then zeros 0 else + { cols, rows } = dimensions m; + v = copyOfVector m[0]; + for [1..rows-1] do row: + for [0..cols-1] do col: + v[col] := v[col] + m[row][col]; + done; + done; + v; + fi); + +mixedDownFromInterleaved rows v is number -> ~double[] -> ~double[] = (cols = (length (arrayWrap v) / rows); - mv = new double[cols]; - for [0..cols-1] do col: - val = sum (map do row: v[col * rows + row] done [0..rows-1]) / rows; - mv[col] := val; + v' = zeros cols; + for [0..rows-1] do row: + for [0..cols-1] do col: + v'[col] := v'[col] + v[col * rows + row]; + done; done; - mv); + v'); { zeros, ones, vector, generateMatrix, constMatrix, randomMatrix, zeroMatrix, identityMatrix, width, cols, height, rows, dimensions, +copyOfVector, copyOfMatrix, transposed, interleaved, deinterleaved, -mixedDown, +mixedDown, mixedDownFromInterleaved, }