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 }