Mercurial > hg > ugly-duckling
annotate src/app/spectrogram/MatrixUtils.ts @ 509:041468f553e1 tip master
Merge pull request #57 from LucasThompson/fix/session-stack-max-call-stack
Fix accidental recursion in PersistentStack
author | Lucas Thompson <LucasThompson@users.noreply.github.com> |
---|---|
date | Mon, 27 Nov 2017 11:04:30 +0000 |
parents | 8bfd9586c78a |
children |
rev | line source |
---|---|
dev@343 | 1 /** |
dev@343 | 2 * Created by lucast on 23/05/2017. |
dev@343 | 3 */ |
dev@343 | 4 |
dev@343 | 5 export function estimatePercentile(matrix, percentile) { |
dev@343 | 6 // our sample is not evenly distributed across the whole data set: |
dev@343 | 7 // it is guaranteed to include at least one sample from every |
dev@343 | 8 // column, and could sample some values more than once. But it |
dev@343 | 9 // should be good enough in most cases (todo: show this) |
dev@343 | 10 if (matrix.length === 0) { |
dev@343 | 11 return 0.0; |
dev@343 | 12 } |
dev@343 | 13 const w = matrix.length; |
dev@343 | 14 const h = matrix[0].length; |
dev@343 | 15 const n = w * h; |
dev@343 | 16 const m = (n > 50000 ? 50000 : n); // should base that on the %ile |
dev@343 | 17 let m_per = Math.floor(m / w); |
dev@343 | 18 if (m_per < 1) { |
dev@343 | 19 m_per = 1; |
dev@343 | 20 } |
dev@343 | 21 |
dev@343 | 22 const sample = []; |
dev@343 | 23 for (let x = 0; x < w; ++x) { |
dev@343 | 24 for (let i = 0; i < m_per; ++i) { |
dev@343 | 25 const y = Math.floor(Math.random() * h); |
dev@343 | 26 const value = matrix[x][y]; |
dev@343 | 27 if (!isNaN(value) && value !== Infinity) { |
dev@343 | 28 sample.push(value); |
dev@343 | 29 } |
dev@343 | 30 } |
dev@343 | 31 } |
dev@343 | 32 if (sample.length === 0) { |
dev@343 | 33 return 0.0; |
dev@343 | 34 } |
dev@343 | 35 sample.sort((a, b) => { return a - b; }); |
dev@343 | 36 const ix = Math.floor((sample.length * percentile) / 100); |
dev@343 | 37 const estimate = sample[ix]; |
dev@343 | 38 return estimate; |
dev@343 | 39 } |