138#include <config_auto.h>
142#include "allheaders.h"
145static const l_int32 BinSizeArray[] = {2, 5, 10, 20, 50, 100, 200, 500, 1000,\
146 2000, 5000, 10000, 20000, 50000, 100000, 200000,\
147 500000, 1000000, 2000000, 5000000, 10000000,\
148 200000000, 50000000, 100000000};
149static const l_int32 NBinSizes = 24;
154#define DEBUG_CROSSINGS 0
155#define DEBUG_FREQUENCY 0
186l_int32 i, j, n, hsize, len;
188l_float32 *fa, *fas, *fad;
192 return (
NUMA *)ERROR_PTR(
"nas not defined", __func__, NULL);
194 return (
NUMA *)ERROR_PTR(
"size must be > 0", __func__, NULL);
195 if ((size & 1) == 0 ) {
196 L_WARNING(
"sel size must be odd; increasing by 1\n", __func__);
201 return numaCopy(nas);
207 n = numaGetCount(nas);
210 if ((fas = (l_float32 *)LEPT_CALLOC(len,
sizeof(l_float32))) == NULL)
211 return (
NUMA *)ERROR_PTR(
"fas not made", __func__, NULL);
212 for (i = 0; i < hsize; i++)
214 for (i = hsize + n; i < len; i++)
217 for (i = 0; i < n; i++)
218 fas[hsize + i] = fa[i];
220 nad = numaMakeConstant(0, n);
221 numaCopyParameters(nad, nas);
223 for (i = 0; i < n; i++) {
225 for (j = 0; j < size; j++)
226 minval = L_MIN(minval, fas[i + j]);
253l_int32 i, j, n, hsize, len;
255l_float32 *fa, *fas, *fad;
259 return (
NUMA *)ERROR_PTR(
"nas not defined", __func__, NULL);
261 return (
NUMA *)ERROR_PTR(
"size must be > 0", __func__, NULL);
262 if ((size & 1) == 0 ) {
263 L_WARNING(
"sel size must be odd; increasing by 1\n", __func__);
268 return numaCopy(nas);
274 n = numaGetCount(nas);
277 if ((fas = (l_float32 *)LEPT_CALLOC(len,
sizeof(l_float32))) == NULL)
278 return (
NUMA *)ERROR_PTR(
"fas not made", __func__, NULL);
279 for (i = 0; i < hsize; i++)
281 for (i = hsize + n; i < len; i++)
284 for (i = 0; i < n; i++)
285 fas[hsize + i] = fa[i];
287 nad = numaMakeConstant(0, n);
288 numaCopyParameters(nad, nas);
290 for (i = 0; i < n; i++) {
292 for (j = 0; j < size; j++)
293 maxval = L_MAX(maxval, fas[i + j]);
323 return (
NUMA *)ERROR_PTR(
"nas not defined", __func__, NULL);
325 return (
NUMA *)ERROR_PTR(
"size must be > 0", __func__, NULL);
326 if ((size & 1) == 0 ) {
327 L_WARNING(
"sel size must be odd; increasing by 1\n", __func__);
332 return numaCopy(nas);
365NUMA *nab, *nat1, *nat2, *nad;
368 return (
NUMA *)ERROR_PTR(
"nas not defined", __func__, NULL);
370 return (
NUMA *)ERROR_PTR(
"size must be > 0", __func__, NULL);
371 if ((size & 1) == 0 ) {
372 L_WARNING(
"sel size must be odd; increasing by 1\n", __func__);
377 return numaCopy(nas);
379 nab = numaAddBorder(nas, size, size, 0);
382 nad = numaRemoveBorder(nat2, size, size);
416 return (
NUMA *)ERROR_PTR(
"nas not defined", __func__, NULL);
417 n = numaGetCount(nas);
418 if ((nad = numaCreate(n)) == NULL)
419 return (
NUMA *)ERROR_PTR(
"nad not made", __func__, NULL);
420 numaCopyParameters(nad, nas);
421 for (i = 0; i < n; i++) {
422 numaGetFValue(nas, i, &val);
423 val = scale * (val + shift);
424 numaAddNumber(nad, val);
450l_float32 sum, sumsq, val, mean, var;
452 if (pmean) *pmean = 0.0;
453 if (pvar) *pvar = 0.0;
454 if (prvar) *prvar = 0.0;
455 if (!pmean && !pvar && !prvar)
456 return ERROR_INT(
"nothing requested", __func__, 1);
458 return ERROR_INT(
"na not defined", __func__, 1);
459 if ((n = numaGetCount(na)) == 0)
460 return ERROR_INT(
"na is empty", __func__, 1);
461 first = L_MAX(0, first);
462 if (last < 0) last = n - 1;
464 return ERROR_INT(
"invalid first", __func__, 1);
466 L_WARNING(
"last = %d is beyond max index = %d; adjusting\n",
467 __func__, last, n - 1);
471 return ERROR_INT(
"first > last\n", __func__, 1);
472 ni = last - first + 1;
474 for (i = first; i <= last; i++) {
475 numaGetFValue(na, i, &val);
484 var = sumsq / ni - mean * mean;
485 if (pvar) *pvar = var;
486 if (prvar) *prvar = sqrtf(var);
535 return ERROR_INT(
"nas not defined", __func__, 1);
536 if (2 * wc + 1 > numaGetCount(nas))
537 L_WARNING(
"filter wider than input array!\n", __func__);
539 if (!pnav && !pnarv) {
577l_int32 i, n, n1, width;
579l_float32 *fa1, *fad, *suma;
583 return (
NUMA *)ERROR_PTR(
"nas not defined", __func__, NULL);
584 n = numaGetCount(nas);
587 L_WARNING(
"filter wider than input array!\n", __func__);
592 nad = numaMakeConstant(0, n);
596 if ((suma = (l_float32 *)LEPT_CALLOC(n1 + 1,
sizeof(l_float32))) == NULL) {
599 return (
NUMA *)ERROR_PTR(
"suma not made", __func__, NULL);
603 for (i = 0; i < n1; i++) {
608 norm = 1.f / (2 * wc + 1);
609 for (i = 0; i < n; i++)
610 fad[i] = norm * (suma[width + i] - suma[i]);
635l_int32 i, n, n1, width;
637l_float32 *fa1, *fad, *suma;
641 return (
NUMA *)ERROR_PTR(
"nas not defined", __func__, NULL);
642 n = numaGetCount(nas);
645 L_WARNING(
"filter wider than input array!\n", __func__);
650 nad = numaMakeConstant(0, n);
654 if ((suma = (l_float32 *)LEPT_CALLOC(n1 + 1,
sizeof(l_float32))) == NULL) {
657 return (
NUMA *)ERROR_PTR(
"suma not made", __func__, NULL);
661 for (i = 0; i < n1; i++) {
662 sum += fa1[i] * fa1[i];
666 norm = 1.f / (2 * wc + 1);
667 for (i = 0; i < n; i++)
668 fad[i] = norm * (suma[width + i] - suma[i]);
705l_float32 *fam, *fams, *fav = NULL, *farv = NULL;
708 if (pnav) *pnav = NULL;
709 if (pnarv) *pnarv = NULL;
711 return ERROR_INT(
"neither &nav nor &narv are defined", __func__, 1);
713 return ERROR_INT(
"nam not defined", __func__, 1);
715 return ERROR_INT(
"nams not defined", __func__, 1);
716 nm = numaGetCount(nam);
717 nms = numaGetCount(nams);
719 return ERROR_INT(
"sizes of nam and nams differ", __func__, 1);
722 nav = numaMakeConstant(0, nm);
727 narv = numaMakeConstant(0, nm);
729 farv = numaGetFArray(narv,
L_NOCOPY);
732 fams = numaGetFArray(nams,
L_NOCOPY);
734 for (i = 0; i < nm; i++) {
735 var = fams[i] - fam[i] * fam[i];
739 farv[i] = sqrtf(var);
769NUMA *na1, *na2, *nad;
772 return (
NUMA *)ERROR_PTR(
"nas not defined", __func__, NULL);
773 if ((n = numaGetCount(nas)) < 3)
774 return numaCopy(nas);
776 L_ERROR(
"filter too small; returning a copy\n", __func__);
777 return numaCopy(nas);
780 if (halfwin > (n - 1) / 2) {
781 halfwin = (n - 1) / 2;
782 L_INFO(
"reducing filter to halfwin = %d\n", __func__, halfwin);
791 for (i = 0; i < n; i++) {
792 na2 = numaClipToInterval(na1, i, i + 2 * halfwin);
793 numaGetMedian(na2, &medval);
794 numaAddNumber(nad, medval);
817 return (
NUMA *)ERROR_PTR(
"nas not defined", __func__, NULL);
819 n = numaGetCount(nas);
820 if ((nad = numaCreate(n)) == NULL)
821 return (
NUMA *)ERROR_PTR(
"nad not made", __func__, NULL);
822 numaCopyParameters(nad, nas);
823 for (i = 0; i < n; i++) {
824 numaGetIValue(nas, i, &ival);
825 numaAddNumber(nad, ival);
866l_int32 i, n, ival, hval;
867l_int32 iminval, imaxval, range, binsize, nbins, ibin;
871 if (pbinsize) *pbinsize = 0;
872 if (pbinstart) *pbinstart = 0;
874 return (
NUMA *)ERROR_PTR(
"na not defined", __func__, NULL);
876 return (
NUMA *)ERROR_PTR(
"maxbins < 1", __func__, NULL);
879 numaGetMin(na, &val, NULL);
880 iminval = (l_int32)(val + 0.5);
881 numaGetMax(na, &val, NULL);
882 imaxval = (l_int32)(val + 0.5);
883 if (pbinstart == NULL) {
886 return (
NUMA *)ERROR_PTR(
"all values < 0", __func__, NULL);
890 range = imaxval - iminval + 1;
891 if (range > maxbins - 1) {
892 ratio = (l_float32)range / (l_float32)maxbins;
894 for (i = 0; i < NBinSizes; i++) {
895 if (ratio < BinSizeArray[i]) {
896 binsize = BinSizeArray[i];
901 return (
NUMA *)ERROR_PTR(
"numbers too large", __func__, NULL);
905 if (pbinsize) *pbinsize = binsize;
906 nbins = 1 + range / binsize;
909 if (pbinstart && binsize > 1) {
911 iminval = binsize * (iminval / binsize);
913 iminval = binsize * ((iminval - binsize + 1) / binsize);
915 if (pbinstart) *pbinstart = iminval;
918 lept_stderr(
" imaxval = %d, range = %d, nbins = %d\n",
919 imaxval, range, nbins);
924 return (
NUMA *)ERROR_PTR(
"nai not made", __func__, NULL);
925 n = numaGetCount(nai);
929 if ((nahist = numaCreate(nbins)) == NULL) {
931 return (
NUMA *)ERROR_PTR(
"nahist not made", __func__, NULL);
933 numaSetCount(nahist, nbins);
934 numaSetParameters(nahist, iminval, binsize);
935 for (i = 0; i < n; i++) {
936 numaGetIValue(nai, i, &ival);
937 ibin = (ival - iminval) / binsize;
938 if (ibin >= 0 && ibin < nbins) {
939 numaGetIValue(nahist, ibin, &hval);
940 numaSetValue(nahist, ibin, hval + 1.0f);
975l_int32 i, n, imin, imax, irange, ibin, ival, allints;
976l_float32 minval, maxval, range, binsize, fval;
980 return (
NUMA *)ERROR_PTR(
"na not defined", __func__, NULL);
981 maxbins = L_MAX(1, maxbins);
984 numaGetMin(na, &minval, NULL);
985 numaGetMax(na, &maxval, NULL);
988 n = numaGetCount(na);
989 numaHasOnlyIntegers(na, &allints);
992 if (allints && (maxval - minval < maxbins)) {
993 imin = (l_int32)minval;
994 imax = (l_int32)maxval;
995 irange = imax - imin + 1;
996 nah = numaCreate(irange);
997 numaSetCount(nah, irange);
998 numaSetParameters(nah, minval, 1.0);
999 for (i = 0; i < n; i++) {
1000 numaGetIValue(na, i, &ival);
1002 numaGetIValue(nah, ibin, &ival);
1003 numaSetValue(nah, ibin, ival + 1.0f);
1010 range = maxval - minval;
1011 binsize = range / (l_float32)maxbins;
1013 nah = numaCreate(1);
1014 numaSetParameters(nah, minval, binsize);
1015 numaAddNumber(nah, n);
1018 nah = numaCreate(maxbins);
1019 numaSetCount(nah, maxbins);
1020 numaSetParameters(nah, minval, binsize);
1021 for (i = 0; i < n; i++) {
1022 numaGetFValue(na, i, &fval);
1023 ibin = (l_int32)((fval - minval) / binsize);
1024 ibin = L_MIN(ibin, maxbins - 1);
1025 numaGetIValue(nah, ibin, &ival);
1026 numaSetValue(nah, ibin, ival + 1.0f);
1058l_int32 i, n, nbins, ival, ibin;
1059l_float32 val, maxval;
1063 return (
NUMA *)ERROR_PTR(
"na not defined", __func__, NULL);
1065 return (
NUMA *)ERROR_PTR(
"binsize must be > 0.0", __func__, NULL);
1066 if (binsize > maxsize)
1069 numaGetMax(na, &maxval, NULL);
1070 n = numaGetCount(na);
1071 maxsize = L_MIN(maxsize, maxval);
1072 nbins = (l_int32)(maxsize / binsize) + 1;
1076 if ((nad = numaCreate(nbins)) == NULL)
1077 return (
NUMA *)ERROR_PTR(
"nad not made", __func__, NULL);
1078 numaSetParameters(nad, 0.0, binsize);
1079 numaSetCount(nad, nbins);
1080 for (i = 0; i < n; i++) {
1081 numaGetFValue(na, i, &val);
1082 ibin = (l_int32)(val / binsize);
1083 if (ibin >= 0 && ibin < nbins) {
1084 numaGetIValue(nad, ibin, &ival);
1085 numaSetValue(nad, ibin, ival + 1.0f);
1104l_int32 i, j, ns, nd, index, count, val;
1105l_float32 start, oldsize;
1109 return (
NUMA *)ERROR_PTR(
"nas not defined", __func__, NULL);
1111 return (
NUMA *)ERROR_PTR(
"newsize must be > 1", __func__, NULL);
1112 if ((ns = numaGetCount(nas)) == 0)
1113 return (
NUMA *)ERROR_PTR(
"no bins in nas", __func__, NULL);
1115 nd = (ns + newsize - 1) / newsize;
1116 if ((nad = numaCreate(nd)) == NULL)
1117 return (
NUMA *)ERROR_PTR(
"nad not made", __func__, NULL);
1118 numaGetParameters(nad, &start, &oldsize);
1119 numaSetParameters(nad, start, oldsize * newsize);
1121 for (i = 0; i < nd; i++) {
1123 index = i * newsize;
1124 for (j = 0; j < newsize; j++) {
1126 numaGetIValue(nas, index, &val);
1131 numaAddNumber(nad, count);
1151l_float32 sum, factor, fval;
1155 return (
NUMA *)ERROR_PTR(
"nas not defined", __func__, NULL);
1157 return (
NUMA *)ERROR_PTR(
"tsum must be > 0.0", __func__, NULL);
1158 if ((ns = numaGetCount(nas)) == 0)
1159 return (
NUMA *)ERROR_PTR(
"no bins in nas", __func__, NULL);
1161 numaGetSum(nas, &sum);
1162 factor = tsum / sum;
1164 if ((nad = numaCreate(ns)) == NULL)
1165 return (
NUMA *)ERROR_PTR(
"nad not made", __func__, NULL);
1166 numaCopyParameters(nad, nas);
1168 for (i = 0; i < ns; i++) {
1169 numaGetFValue(nas, i, &fval);
1171 numaAddNumber(nad, fval);
1232 l_float32 *pvariance,
1239l_float32 minval, maxval, fval, mean, sum;
1242 if (pmin) *pmin = 0.0;
1243 if (pmax) *pmax = 0.0;
1244 if (pmean) *pmean = 0.0;
1245 if (pvariance) *pvariance = 0.0;
1246 if (pmedian) *pmedian = 0.0;
1247 if (prval) *prval = 0.0;
1248 if (phisto) *phisto = NULL;
1250 return ERROR_INT(
"na not defined", __func__, 1);
1251 if ((n = numaGetCount(na)) == 0)
1252 return ERROR_INT(
"numa is empty", __func__, 1);
1254 numaGetMin(na, &minval, NULL);
1255 numaGetMax(na, &maxval, NULL);
1256 if (pmin) *pmin = minval;
1257 if (pmax) *pmax = maxval;
1258 if (pmean || pvariance) {
1260 for (i = 0; i < n; i++) {
1261 numaGetFValue(na, i, &fval);
1264 mean = sum / (l_float32)n;
1265 if (pmean) *pmean = mean;
1269 for (i = 0; i < n; i++) {
1270 numaGetFValue(na, i, &fval);
1273 *pvariance = sum / (l_float32)n - mean * mean;
1276 if (!pmedian && !prval && !phisto)
1320 l_float32 *pxmedian,
1322 l_float32 *pxvariance)
1324 if (pxmean) *pxmean = 0.0;
1325 if (pxmedian) *pxmedian = 0.0;
1326 if (pxmode) *pxmode = 0.0;
1327 if (pxvariance) *pxvariance = 0.0;
1329 return ERROR_INT(
"nahisto not defined", __func__, 1);
1332 pxmean, pxmedian, pxmode,
1369 l_float32 *pxmedian,
1371 l_float32 *pxvariance)
1374l_float32 sum, sumval, halfsum, moment, var, x, y, ymax;
1376 if (pxmean) *pxmean = 0.0;
1377 if (pxmedian) *pxmedian = 0.0;
1378 if (pxmode) *pxmode = 0.0;
1379 if (pxvariance) *pxvariance = 0.0;
1381 return ERROR_INT(
"nahisto not defined", __func__, 1);
1382 if (!pxmean && !pxmedian && !pxmode && !pxvariance)
1383 return ERROR_INT(
"nothing to compute", __func__, 1);
1385 n = numaGetCount(nahisto);
1386 ifirst = L_MAX(0, ifirst);
1387 if (ilast < 0) ilast = n - 1;
1389 return ERROR_INT(
"invalid ifirst", __func__, 1);
1391 L_WARNING(
"ilast = %d is beyond max index = %d; adjusting\n",
1392 __func__, ilast, n - 1);
1396 return ERROR_INT(
"ifirst > ilast", __func__, 1);
1397 for (sum = 0.0, moment = 0.0, var = 0.0, i = ifirst; i <= ilast ; i++) {
1398 x = startx + i * deltax;
1399 numaGetFValue(nahisto, i, &y);
1405 L_INFO(
"sum is 0\n", __func__);
1410 *pxmean = moment / sum;
1412 *pxvariance = var / sum - moment * moment / (sum * sum);
1415 halfsum = sum / 2.0f;
1416 for (sumval = 0.0, i = ifirst; i <= ilast; i++) {
1417 numaGetFValue(nahisto, i, &y);
1419 if (sumval >= halfsum) {
1420 *pxmedian = startx + i * deltax;
1429 for (i = ifirst; i <= ilast; i++) {
1430 numaGetFValue(nahisto, i, &y);
1436 *pxmode = startx + imax * deltax;
1466 if (pnax) *pnax = NULL;
1468 return ERROR_INT(
"&nay not defined", __func__, 1);
1471 return ERROR_INT(
"nasy not defined", __func__, 1);
1472 if ((n = numaGetCount(nasy)) == 0)
1473 return ERROR_INT(
"no bins in nas", __func__, 1);
1478 nar = numaCreate(n + 1);
1480 numaAddNumber(nar, sum);
1481 for (i = 0; i < n; i++) {
1482 numaGetFValue(nan, i, &fval);
1484 numaAddNumber(nar, sum);
1490 startx, startx + n * deltax, npts,
1525l_int32 i, ibinval, n;
1526l_float32 startval, binsize, binval, maxval, fractval, total, sum, val;
1529 return ERROR_INT(
"prank not defined", __func__, 1);
1532 return ERROR_INT(
"na not defined", __func__, 1);
1533 numaGetParameters(na, &startval, &binsize);
1534 n = numaGetCount(na);
1535 if (rval < startval)
1537 maxval = startval + n * binsize;
1538 if (rval > maxval) {
1543 binval = (rval - startval) / binsize;
1544 ibinval = (l_int32)binval;
1549 fractval = binval - (l_float32)ibinval;
1552 for (i = 0; i < ibinval; i++) {
1553 numaGetFValue(na, i, &val);
1556 numaGetFValue(na, ibinval, &val);
1557 sum += fractval * val;
1558 numaGetSum(na, &total);
1559 *prank = sum / total;
1595l_float32 startval, binsize, rankcount, total, sum, fract, val;
1598 return ERROR_INT(
"prval not defined", __func__, 1);
1601 return ERROR_INT(
"na not defined", __func__, 1);
1603 L_WARNING(
"rank < 0; setting to 0.0\n", __func__);
1607 L_WARNING(
"rank > 1.0; setting to 1.0\n", __func__);
1611 n = numaGetCount(na);
1612 numaGetParameters(na, &startval, &binsize);
1613 numaGetSum(na, &total);
1614 rankcount = rank * total;
1617 for (i = 0; i < n; i++) {
1618 numaGetFValue(na, i, &val);
1619 if (sum + val >= rankcount)
1626 fract = (rankcount - sum) / val;
1630 *prval = startval + binsize * ((l_float32)i + fract);
1667l_int32 i, ntot, bincount, binindex, binsize;
1668l_float32 sum, val, ave;
1671 return ERROR_INT(
"&nabinval not defined", __func__, 1);
1674 return ERROR_INT(
"na not defined", __func__, 1);
1676 return ERROR_INT(
"nbins must be > 1", __func__, 1);
1679 ntot = numaGetCount(na);
1681 return ERROR_INT(
"naeach not made", __func__, 1);
1687 numaGetIValue(naeach, 0, &binsize);
1688 nabinval = numaCreate(nbins);
1689 for (i = 0; i < ntot; i++) {
1690 numaGetFValue(na, i, &val);
1693 if (bincount == binsize) {
1694 ave = sum / binsize;
1695 numaAddNumber(nabinval, ave);
1699 if (binindex == nbins)
break;
1700 numaGetIValue(naeach, binindex, &binsize);
1703 *pnabinval = nabinval;
1705 numaDestroy(&naeach);
1743l_int32 i, j, nxvals, occup, count, bincount, binindex, binsize;
1744l_float32 sum, ave, ntot;
1746 if (pnarank) *pnarank = NULL;
1748 return ERROR_INT(
"&nabinval not defined", __func__, 1);
1751 return ERROR_INT(
"na not defined", __func__, 1);
1753 return ERROR_INT(
"nbins must be > 1", __func__, 1);
1755 nxvals = numaGetCount(na);
1756 numaGetSum(na, &ntot);
1757 occup = ntot / nxvals;
1758 if (occup < 1) L_INFO(
"average occupancy %d < 1\n", __func__, occup);
1762 return ERROR_INT(
"naeach not made", __func__, 1);
1768 numaGetIValue(naeach, 0, &binsize);
1769 nabinval = numaCreate(nbins);
1770 for (i = 0; i < nxvals; i++) {
1771 numaGetIValue(na, i, &count);
1772 for (j = 0; j < count; j++) {
1775 if (bincount == binsize) {
1776 ave = sum / binsize;
1777 numaAddNumber(nabinval, ave);
1781 if (binindex == nbins)
break;
1782 numaGetIValue(naeach, binindex, &binsize);
1785 if (binindex == nbins)
break;
1787 *pnabinval = nabinval;
1788 if (binindex != nbins)
1789 L_ERROR(
"binindex = %d != nbins = %d\n", __func__, binindex, nbins);
1795 *pnarank = numaGetPartialSums(nan);
1798 numaDestroy(&naeach);
1827l_int32 maxbins, type;
1828l_float32 maxval, delx;
1831 return ERROR_INT(
"&pnam not defined", __func__, 1);
1834 return ERROR_INT(
"na not defined", __func__, 1);
1835 if (numaGetCount(na) == 0)
1836 return ERROR_INT(
"na is empty", __func__, 1);
1838 return ERROR_INT(
"nbins must be > 1", __func__, 1);
1846 type = numaChooseSortType(na);
1848 L_INFO(
"sort the array: input size = %d\n", __func__, numaGetCount(na));
1859 L_INFO(
"use a histogram: input size = %d\n", __func__, numaGetCount(na));
1860 numaGetMax(na, &maxval, NULL);
1861 maxbins = L_MIN(100002, (l_int32)maxval + 2);
1866 numaGetParameters(na1, NULL, &delx);
1868 L_WARNING(
"scale change: delx = %6.2f\n", __func__, delx);
1894l_int32 i, start, end;
1898 return (
NUMA *)ERROR_PTR(
"ntotal <= 0", __func__, NULL);
1900 return (
NUMA *)ERROR_PTR(
"nbins <= 0", __func__, NULL);
1902 if ((naeach = numaCreate(nbins)) == NULL)
1903 return (
NUMA *)ERROR_PTR(
"naeach not made", __func__, NULL);
1905 if (ntotal < nbins) {
1906 for (i = 0; i < ntotal; i++)
1907 numaAddNumber(naeach, 1);
1912 for (i = 0; i < nbins; i++) {
1913 end = ntotal * (i + 1) / nbins;
1914 numaAddNumber(naeach, end - start);
1975 l_float32 scorefract,
1976 l_int32 *psplitindex,
1983l_int32 i, n, bestsplit, minrange, maxrange, maxindex;
1984l_float32 ave1, ave2, ave1prev, ave2prev;
1985l_float32 num1, num2, num1prev, num2prev;
1986l_float32 val, minval, sum, fract1;
1987l_float32 norm, score, minscore, maxscore;
1988NUMA *nascore, *naave1, *naave2, *nanum1, *nanum2;
1990 if (psplitindex) *psplitindex = 0;
1991 if (pave1) *pave1 = 0.0;
1992 if (pave2) *pave2 = 0.0;
1993 if (pnum1) *pnum1 = 0.0;
1994 if (pnum2) *pnum2 = 0.0;
1995 if (pnascore) *pnascore = NULL;
1997 return ERROR_INT(
"na not defined", __func__, 1);
1999 n = numaGetCount(na);
2001 return ERROR_INT(
"n = 1 in histogram", __func__, 1);
2002 numaGetSum(na, &sum);
2004 return ERROR_INT(
"sum <= 0.0", __func__, 1);
2005 norm = 4.0f / ((l_float32)(n - 1) * (n - 1));
2015 if ((nascore = numaCreate(n)) == NULL)
2016 return ERROR_INT(
"nascore not made", __func__, 1);
2017 naave1 = (pave1) ? numaCreate(n) : NULL;
2018 naave2 = (pave2) ? numaCreate(n) : NULL;
2019 nanum1 = (pnum1) ? numaCreate(n) : NULL;
2020 nanum2 = (pnum2) ? numaCreate(n) : NULL;
2022 for (i = 0; i < n; i++) {
2023 numaGetFValue(na, i, &val);
2024 num1 = num1prev + val;
2028 ave1 = (num1prev * ave1prev + i * val) / num1;
2029 num2 = num2prev - val;
2033 ave2 = (num2prev * ave2prev - i * val) / num2;
2034 fract1 = num1 / sum;
2035 score = norm * (fract1 * (1 - fract1)) * (ave2 - ave1) * (ave2 - ave1);
2036 numaAddNumber(nascore, score);
2037 if (pave1) numaAddNumber(naave1, ave1);
2038 if (pave2) numaAddNumber(naave2, ave2);
2039 if (pnum1) numaAddNumber(nanum1, num1);
2040 if (pnum2) numaAddNumber(nanum2, num2);
2041 if (score > maxscore) {
2054 minscore = (1.f - scorefract) * maxscore;
2055 for (i = maxindex - 1; i >= 0; i--) {
2056 numaGetFValue(nascore, i, &val);
2061 for (i = maxindex + 1; i < n; i++) {
2062 numaGetFValue(nascore, i, &val);
2067 numaGetFValue(na, minrange, &minval);
2068 bestsplit = minrange;
2069 for (i = minrange + 1; i <= maxrange; i++) {
2070 numaGetFValue(na, i, &val);
2080 bestsplit = L_MIN(255, bestsplit + 1);
2082 if (psplitindex) *psplitindex = bestsplit;
2083 if (pave1) numaGetFValue(naave1, bestsplit, pave1);
2084 if (pave2) numaGetFValue(naave2, bestsplit, pave2);
2085 if (pnum1) numaGetFValue(nanum1, bestsplit, pnum1);
2086 if (pnum2) numaGetFValue(nanum2, bestsplit, pnum2);
2089 lept_stderr(
"minrange = %d, maxrange = %d\n", minrange, maxrange);
2090 lept_stderr(
"minval = %10.0f\n", minval);
2091 gplotSimple1(nascore, GPLOT_PNG,
"/tmp/lept/nascore",
2092 "Score for split distribution");
2093 *pnascore = nascore;
2095 numaDestroy(&nascore);
2098 if (pave1) numaDestroy(&naave1);
2099 if (pave2) numaDestroy(&naave2);
2100 if (pnum1) numaDestroy(&nanum1);
2101 if (pnum2) numaDestroy(&nanum2);
2140NUMA *na1, *na2, *nad;
2143 return ERROR_INT(
"&nad not defined", __func__, 1);
2146 return ERROR_INT(
"na1 and na2 not both defined", __func__, 1);
2147 n = numaaGetCount(naa1);
2148 if (n != numaaGetCount(naa2))
2149 return ERROR_INT(
"naa1 and naa2 numa counts differ", __func__, 1);
2150 nt = numaaGetNumberCount(naa1);
2151 if (nt != numaaGetNumberCount(naa2))
2152 return ERROR_INT(
"naa1 and naa2 number counts differ", __func__, 1);
2154 return ERROR_INT(
"na sizes must be 256", __func__, 1);
2156 nad = numaCreate(n);
2158 for (i = 0; i < n; i++) {
2159 na1 = numaaGetNuma(naa1, i,
L_CLONE);
2160 na2 = numaaGetNuma(naa2, i,
L_CLONE);
2162 numaAddNumber(nad, dist / 255.f);
2203l_float32 sum1, sum2, diff, total;
2204l_float32 *array1, *array3;
2208 return ERROR_INT(
"&dist not defined", __func__, 1);
2211 return ERROR_INT(
"na1 and na2 not both defined", __func__, 1);
2212 n = numaGetCount(na1);
2213 if (n != numaGetCount(na2))
2214 return ERROR_INT(
"na1 and na2 have different size", __func__, 1);
2217 numaGetSum(na1, &sum1);
2218 numaGetSum(na2, &sum2);
2219 norm = (L_ABS(sum1 - sum2) < 0.00001 * L_ABS(sum1)) ? 1 : 0;
2223 na3 = numaCopy(na2);
2224 array1 = numaGetFArray(na1,
L_NOCOPY);
2225 array3 = numaGetFArray(na3,
L_NOCOPY);
2229 for (i = 1; i < n; i++) {
2230 diff = array1[i - 1] - array3[i - 1];
2232 total += L_ABS(diff);
2234 *pdist = total / sum1;
2296l_float32 mean, var, rvar;
2297NUMA *na1, *na2, *na3, *na4;
2299 if (pnam) *pnam = NULL;
2300 if (pnams) *pnams = NULL;
2301 if (pnav) *pnav = NULL;
2302 if (pnarv) *pnarv = NULL;
2303 if (!pnam && !pnams && !pnav && !pnarv)
2304 return ERROR_INT(
"nothing requested", __func__, 1);
2306 return ERROR_INT(
"naa not defined", __func__, 1);
2307 n = numaaGetCount(naa);
2308 for (i = 0; i < n; i++) {
2309 nn = numaaGetNumaCount(naa, i);
2311 L_ERROR(
"%d numbers in numa[%d]\n", __func__, nn, i);
2316 if (pnam) *pnam = numaCreate(256);
2317 if (pnams) *pnams = numaCreate(256);
2318 if (pnav) *pnav = numaCreate(256);
2319 if (pnarv) *pnarv = numaCreate(256);
2323 arrays = (l_float32 **)LEPT_CALLOC(n,
sizeof(l_float32 *));
2324 for (i = 0; i < n; i++) {
2325 na1 = numaaGetNuma(naa, i,
L_CLONE);
2328 arrays[i] = numaGetFArray(na3,
L_COPY);
2335 for (j = 0; j < 256; j++) {
2336 na4 = numaCreate(n);
2337 for (i = 0; i < n; i++) {
2338 numaAddNumber(na4, arrays[i][j]);
2341 if (pnam) numaAddNumber(*pnam, mean);
2342 if (pnams) numaAddNumber(*pnams, mean * mean);
2343 if (pnav) numaAddNumber(*pnav, var);
2344 if (pnarv) numaAddNumber(*pnarv, rvar);
2348 for (i = 0; i < n; i++)
2349 LEPT_FREE(arrays[i]);
2380l_int32 i, k, n, maxloc, lloc, rloc;
2381l_float32 fmaxval, sum, total, newtotal, val, lastval;
2386 return (
NUMA *)ERROR_PTR(
"nas not defined", __func__, NULL);
2387 n = numaGetCount(nas);
2388 numaGetSum(nas, &total);
2391 if ((na = numaCopy(nas)) == NULL)
2392 return (
NUMA *)ERROR_PTR(
"na not made", __func__, NULL);
2393 if ((napeak = numaCreate(4 * nmax)) == NULL) {
2395 return (
NUMA *)ERROR_PTR(
"napeak not made", __func__, NULL);
2398 for (k = 0; k < nmax; k++) {
2399 numaGetSum(na, &newtotal);
2400 if (newtotal == 0.0)
2402 numaGetMax(na, &fmaxval, &maxloc);
2406 for (i = maxloc - 1; i >= 0; --i) {
2407 numaGetFValue(na, i, &val);
2412 if (val > fract1 * fmaxval) {
2417 if (lastval - val > fract2 * lastval) {
2427 for (i = maxloc + 1; i < n; ++i) {
2428 numaGetFValue(na, i, &val);
2433 if (val > fract1 * fmaxval) {
2438 if (lastval - val > fract2 * lastval) {
2446 peakfract = sum / total;
2447 numaAddNumber(napeak, lloc);
2448 numaAddNumber(napeak, maxloc);
2449 numaAddNumber(napeak, rloc);
2450 numaAddNumber(napeak, peakfract);
2452 for (i = lloc; i <= rloc; i++)
2453 numaSetValue(na, i, 0.0);
2495l_int32 i, n, found, loc, direction;
2496l_float32 startval, val, maxval, minval;
2499 if (pnav) *pnav = NULL;
2501 return (
NUMA *)ERROR_PTR(
"nas not defined", __func__, NULL);
2503 return (
NUMA *)ERROR_PTR(
"delta < 0", __func__, NULL);
2505 n = numaGetCount(nas);
2506 nad = numaCreate(0);
2509 nav = numaCreate(0);
2516 numaGetFValue(nas, 0, &startval);
2518 for (i = 1; i < n; i++) {
2519 numaGetFValue(nas, i, &val);
2520 if (L_ABS(val - startval) >= delta) {
2530 if (val > startval) {
2541 for (i = i + 1; i < n; i++) {
2542 numaGetFValue(nas, i, &val);
2543 if (direction == 1 && val > maxval ) {
2546 }
else if (direction == -1 && val < minval ) {
2549 }
else if (direction == 1 && (maxval - val >= delta)) {
2550 numaAddNumber(nad, loc);
2551 if (nav) numaAddNumber(nav, maxval);
2555 }
else if (direction == -1 && (val - minval >= delta)) {
2556 numaAddNumber(nad, loc);
2557 if (nav) numaAddNumber(nav, minval);
2602l_int32 i, n, start, index, minloc, found;
2603l_float32 val, pval, jval, minval, maxval, sum, partsum;
2606 if (pfract) *pfract = 0.0;
2608 return ERROR_INT(
"&thresh not defined", __func__, 1);
2611 return ERROR_INT(
"na not defined", __func__, 1);
2612 if (skip <= 0) skip = 20;
2615 numaGetMin(na, &minval, NULL);
2616 numaGetMax(na, &maxval, NULL);
2617 if (minval == maxval)
2618 return ERROR_INT(
"all array values are the same", __func__, 1);
2621 n = numaGetCount(na);
2623 L_WARNING(
"array size %d < 256\n", __func__, n);
2626 for (i = 1; i < n; i++) {
2628 index = L_MIN(i + skip, n - 1);
2630 if (val < pval && jval < pval)
2636 return ERROR_INT(
"top of first peak not found", __func__, 1);
2642 for (i = start + 1; i < n; i++) {
2647 index = L_MIN(i + skip, n - 1);
2659 return ERROR_INT(
"no minimum found", __func__, 1);
2664 for (i = index - 1; i > index - skip; i--) {
2665 if (fa[i] < minval) {
2672 if (minloc > n - 10)
2673 return ERROR_INT(
"minimum at end of array; invalid", __func__, 1);
2678 numaGetSumOnInterval(na, 0, minloc, &partsum);
2679 numaGetSum(na, &sum);
2681 *pfract = partsum / sum;
2710 l_float32 minreversal,
2714l_int32 i, n, nr, ival, binvals;
2716l_float32 fval, delx, len;
2720 if (prd) *prd = 0.0;
2722 return ERROR_INT(
"neither &nr nor &rd are defined", __func__, 1);
2724 return ERROR_INT(
"nas not defined", __func__, 1);
2725 if ((n = numaGetCount(nas)) == 0) {
2726 L_INFO(
"nas is empty\n", __func__);
2729 if (minreversal < 0.0)
2730 return ERROR_INT(
"minreversal < 0", __func__, 1);
2734 for (i = 0; i < n; i++) {
2735 numaGetFValue(nas, i, &fval);
2736 if (fval != 0.0 && fval != 1.0) {
2744 if (minreversal > 1.0) {
2745 L_WARNING(
"binary values but minreversal > 1\n", __func__);
2747 ia = numaGetIArray(nas);
2749 for (i = 1; i < n; i++) {
2750 if (ia[i] != ival) {
2759 nr = numaGetCount(nat);
2764 numaGetParameters(nas, NULL, &delx);
2766 *prd = (l_float32)nr / len;
2805 l_float32 estthresh,
2806 l_float32 *pbestthresh)
2808l_int32 i, inrun, istart, iend, maxstart, maxend, runlen, maxrunlen;
2809l_int32 val, maxval, nmax, count;
2810l_float32 thresh, fmaxval, fmodeval;
2814 return ERROR_INT(
"&bestthresh not defined", __func__, 1);
2817 return ERROR_INT(
"nay not defined", __func__, 1);
2818 if (numaGetCount(nay) < 2) {
2819 L_WARNING(
"nay count < 2; no threshold crossing\n", __func__);
2824 nat = numaCreate(41);
2825 for (i = 0; i < 41; i++) {
2826 thresh = estthresh - 80.0f + 4.0f * i;
2828 numaAddNumber(nat, numaGetCount(nac));
2834 numaGetMax(nat, &fmaxval, NULL);
2835 maxval = (l_int32)fmaxval;
2837 for (i = 0; i < 41; i++) {
2838 numaGetIValue(nat, i, &val);
2843 numaGetMode(nat, &fmodeval, &count);
2844 if (count > nmax && fmodeval > 0.5 * fmaxval)
2845 maxval = (l_int32)fmodeval;
2850 maxrunlen = 0, maxstart = 0, maxend = 0;
2851 for (i = 0; i < 41; i++) {
2852 numaGetIValue(nat, i, &val);
2853 if (val == maxval) {
2860 if (inrun && (val != maxval)) {
2862 runlen = iend - istart + 1;
2864 if (runlen > maxrunlen) {
2872 runlen = i - istart;
2873 if (runlen > maxrunlen) {
2880 *pbestthresh = estthresh - 80.0f + 2.0f * (l_float32)(maxstart + maxend);
2883 lept_stderr(
"\nCrossings attain a maximum at %d thresholds, between:\n"
2884 " thresh[%d] = %5.1f and thresh[%d] = %5.1f\n",
2885 nmax, maxstart, estthresh - 80.0 + 4.0 * maxstart,
2886 maxend, estthresh - 80.0 + 4.0 * maxend);
2887 lept_stderr(
"The best choice: %5.1f\n", *pbestthresh);
2888 lept_stderr(
"Number of crossings at the 41 thresholds:");
2889 numaWriteStderr(nat);
2917l_float32 startx, delx;
2918l_float32 xval1, xval2, yval1, yval2, delta1, delta2, crossval, fract;
2922 return (
NUMA *)ERROR_PTR(
"nay not defined", __func__, NULL);
2923 n = numaGetCount(nay);
2925 if (nax && (numaGetCount(nax) != n))
2926 return (
NUMA *)ERROR_PTR(
"nax and nay sizes differ", __func__, NULL);
2928 nad = numaCreate(0);
2929 if (n < 2)
return nad;
2930 numaGetFValue(nay, 0, &yval1);
2931 numaGetParameters(nay, &startx, &delx);
2933 numaGetFValue(nax, 0, &xval1);
2936 for (i = 1; i < n; i++) {
2937 numaGetFValue(nay, i, &yval2);
2939 numaGetFValue(nax, i, &xval2);
2941 xval2 = startx + i * delx;
2942 delta1 = yval1 - thresh;
2943 delta2 = yval2 - thresh;
2944 if (delta1 == 0.0) {
2945 numaAddNumber(nad, xval1);
2946 }
else if (delta2 == 0.0) {
2947 numaAddNumber(nad, xval2);
2948 }
else if (delta1 * delta2 < 0.0) {
2949 fract = L_ABS(delta1) / L_ABS(yval1 - yval2);
2950 crossval = xval1 + fract * (xval2 - xval1);
2951 numaAddNumber(nad, crossval);
2980l_int32 i, j, n, np, previndex, curindex;
2981l_float32 startx, delx;
2982l_float32 xval1, xval2, yval1, yval2, delta1, delta2;
2983l_float32 prevval, curval, thresh, crossval, fract;
2987 return (
NUMA *)ERROR_PTR(
"nay not defined", __func__, NULL);
2989 n = numaGetCount(nay);
2990 if (nax && (numaGetCount(nax) != n))
2991 return (
NUMA *)ERROR_PTR(
"nax and nay sizes differ", __func__, NULL);
2997 numaAddNumber(nap, n - 1);
2998 np = numaGetCount(nap);
2999 L_INFO(
"Number of crossings: %d\n", __func__, np);
3002 nad = numaCreate(np);
3004 numaGetFValue(nay, 0, &prevval);
3005 numaGetParameters(nay, &startx, &delx);
3006 for (i = 0; i < np; i++) {
3007 numaGetIValue(nap, i, &curindex);
3008 numaGetFValue(nay, curindex, &curval);
3009 thresh = (prevval + curval) / 2.0f;
3011 numaGetFValue(nax, previndex, &xval1);
3013 xval1 = startx + previndex * delx;
3014 numaGetFValue(nay, previndex, &yval1);
3015 for (j = previndex + 1; j <= curindex; j++) {
3017 numaGetFValue(nax, j, &xval2);
3019 xval2 = startx + j * delx;
3020 numaGetFValue(nay, j, &yval2);
3021 delta1 = yval1 - thresh;
3022 delta2 = yval2 - thresh;
3023 if (delta1 == 0.0) {
3024 numaAddNumber(nad, xval1);
3026 }
else if (delta2 == 0.0) {
3027 numaAddNumber(nad, xval2);
3029 }
else if (delta1 * delta2 < 0.0) {
3030 fract = L_ABS(delta1) / L_ABS(yval1 - yval2);
3031 crossval = xval1 + fract * (xval2 - xval1);
3032 numaAddNumber(nad, crossval);
3038 previndex = curindex;
3086 l_float32 relweight,
3091 l_float32 *pbestwidth,
3092 l_float32 *pbestshift,
3093 l_float32 *pbestscore)
3096l_float32 delwidth, delshift, width, shift, score;
3097l_float32 bestwidth, bestshift, bestscore;
3099 if (pbestscore) *pbestscore = 0.0;
3100 if (pbestwidth) *pbestwidth = 0.0;
3101 if (pbestshift) *pbestshift = 0.0;
3102 if (!pbestwidth || !pbestshift)
3103 return ERROR_INT(
"&bestwidth and &bestshift not defined", __func__, 1);
3105 return ERROR_INT(
"nas not defined", __func__, 1);
3107 bestscore = bestwidth = bestshift = 0.0;
3108 delwidth = (maxwidth - minwidth) / (nwidth - 1.0f);
3109 for (i = 0; i < nwidth; i++) {
3110 width = minwidth + delwidth * i;
3111 delshift = width / (l_float32)(nshift);
3112 for (j = 0; j < nshift; j++) {
3113 shift = j * delshift;
3115 if (score > bestscore) {
3120 lept_stderr(
"width = %7.3f, shift = %7.3f, score = %7.3f\n",
3121 width, shift, score);
3127 *pbestwidth = bestwidth;
3128 *pbestshift = bestshift;
3130 *pbestscore = bestscore;
3171 l_float32 relweight,
3174l_int32 i, n, nsamp, index;
3175l_float32 score, weight, val;
3178 return ERROR_INT(
"&score not defined", __func__, 1);
3181 return ERROR_INT(
"nas not defined", __func__, 1);
3182 if ((n = numaGetCount(nas)) < 2 * width)
3183 return ERROR_INT(
"nas size too small", __func__, 1);
3186 nsamp = (l_int32)((n - shift) / width);
3187 for (i = 0; i < nsamp; i++) {
3188 index = (l_int32)(shift + i * width);
3189 weight = (i % 2) ? 1.0f : -1.0f * relweight;
3190 numaGetFValue(nas, index, &val);
3191 score += weight * val;
3194 *pscore = 2.0f * width * score / (l_float32)n;
3228l_int32 i, nsets, val;
3232 first = L_MAX(0, first);
3234 return (
NUMA *)ERROR_PTR(
"last < first!", __func__, NULL);
3236 return (
NUMA *)ERROR_PTR(
"nmax < 1!", __func__, NULL);
3238 nsets = L_MIN(nmax, last - first + 1);
3242 return (
NUMA *)ERROR_PTR(
"nsets == 0", __func__, NULL);
3249 delta = (l_float32)(last - first) / (nsets - 1);
3251 delta = (l_float32)(last - first - 1) / (nsets - 1);
3254 na = numaCreate(nsets);
3255 for (i = 0; i < nsets; i++) {
3256 val = (l_int32)(first + i * delta + 0.5);
3257 numaAddNumber(na, val);
3259 numaAddNumber(na, val + 1);
NUMA * numaErode(NUMA *nas, l_int32 size)
numaErode()
l_ok numaGetRankBinValues(NUMA *na, l_int32 nbins, NUMA **pnam)
numaGetRankBinValues()
NUMA * genConstrainedNumaInRange(l_int32 first, l_int32 last, l_int32 nmax, l_int32 use_pairs)
genConstrainedNumaInRange()
l_ok numaCountReversals(NUMA *nas, l_float32 minreversal, l_int32 *pnr, l_float32 *prd)
numaCountReversals()
NUMA * numaWindowedMeanSquare(NUMA *nas, l_int32 wc)
numaWindowedMeanSquare()
NUMA * numaClose(NUMA *nas, l_int32 size)
numaClose()
NUMA * numaNormalizeHistogram(NUMA *nas, l_float32 tsum)
numaNormalizeHistogram()
NUMA * numaWindowedMedian(NUMA *nas, l_int32 halfwin)
numaWindowedMedian()
l_ok numaEvalHaarSum(NUMA *nas, l_float32 width, l_float32 shift, l_float32 relweight, l_float32 *pscore)
numaEvalHaarSum()
NUMA * numaDilate(NUMA *nas, l_int32 size)
numaDilate()
l_ok numaEarthMoverDistance(NUMA *na1, NUMA *na2, l_float32 *pdist)
numaEarthMoverDistance()
l_ok numaSelectCrossingThreshold(NUMA *nax, NUMA *nay, l_float32 estthresh, l_float32 *pbestthresh)
numaSelectCrossingThreshold()
NUMA * numaTransform(NUMA *nas, l_float32 shift, l_float32 scale)
numaTransform()
l_ok numaWindowedStats(NUMA *nas, l_int32 wc, NUMA **pnam, NUMA **pnams, NUMA **pnav, NUMA **pnarv)
numaWindowedStats()
NUMA * numaGetUniformBinSizes(l_int32 ntotal, l_int32 nbins)
numaGetUniformBinSizes()
l_ok numaWindowedVariance(NUMA *nam, NUMA *nams, NUMA **pnav, NUMA **pnarv)
numaWindowedVariance()
l_ok numaEvalBestHaarParameters(NUMA *nas, l_float32 relweight, l_int32 nwidth, l_int32 nshift, l_float32 minwidth, l_float32 maxwidth, l_float32 *pbestwidth, l_float32 *pbestshift, l_float32 *pbestscore)
numaEvalBestHaarParameters()
l_ok numaDiscretizeHistoInBins(NUMA *na, l_int32 nbins, NUMA **pnabinval, NUMA **pnarank)
numaDiscretizeHistoInBins()
l_ok numaGetHistogramStatsOnInterval(NUMA *nahisto, l_float32 startx, l_float32 deltax, l_int32 ifirst, l_int32 ilast, l_float32 *pxmean, l_float32 *pxmedian, l_float32 *pxmode, l_float32 *pxvariance)
numaGetHistogramStatsOnInterval()
NUMA * numaWindowedMean(NUMA *nas, l_int32 wc)
numaWindowedMean()
l_ok numaGetHistogramStats(NUMA *nahisto, l_float32 startx, l_float32 deltax, l_float32 *pxmean, l_float32 *pxmedian, l_float32 *pxmode, l_float32 *pxvariance)
numaGetHistogramStats()
l_ok grayHistogramsToEMD(NUMAA *naa1, NUMAA *naa2, NUMA **pnad)
grayHistogramsToEMD()
NUMA * numaCrossingsByPeaks(NUMA *nax, NUMA *nay, l_float32 delta)
numaCrossingsByPeaks()
NUMA * numaOpen(NUMA *nas, l_int32 size)
numaOpen()
NUMA * numaCrossingsByThreshold(NUMA *nax, NUMA *nay, l_float32 thresh)
numaCrossingsByThreshold()
l_ok numaMakeRankFromHistogram(l_float32 startx, l_float32 deltax, NUMA *nasy, l_int32 npts, NUMA **pnax, NUMA **pnay)
numaMakeRankFromHistogram()
NUMA * numaMakeHistogramAuto(NUMA *na, l_int32 maxbins)
numaMakeHistogramAuto()
l_ok numaSplitDistribution(NUMA *na, l_float32 scorefract, l_int32 *psplitindex, l_float32 *pave1, l_float32 *pave2, l_float32 *pnum1, l_float32 *pnum2, NUMA **pnascore)
numaSplitDistribution()
l_ok numaHistogramGetRankFromVal(NUMA *na, l_float32 rval, l_float32 *prank)
numaHistogramGetRankFromVal()
NUMA * numaRebinHistogram(NUMA *nas, l_int32 newsize)
numaRebinHistogram()
l_ok numaHistogramGetValFromRank(NUMA *na, l_float32 rank, l_float32 *prval)
numaHistogramGetValFromRank()
NUMA * numaConvertToInt(NUMA *nas)
numaConvertToInt()
NUMA * numaFindExtrema(NUMA *nas, l_float32 delta, NUMA **pnav)
numaFindExtrema()
l_ok numaFindLocForThreshold(NUMA *na, l_int32 skip, l_int32 *pthresh, l_float32 *pfract)
numaFindLocForThreshold()
l_ok grayInterHistogramStats(NUMAA *naa, l_int32 wc, NUMA **pnam, NUMA **pnams, NUMA **pnav, NUMA **pnarv)
grayInterHistogramStats()
NUMA * numaFindPeaks(NUMA *nas, l_int32 nmax, l_float32 fract1, l_float32 fract2)
numaFindPeaks()
l_ok numaSimpleStats(NUMA *na, l_int32 first, l_int32 last, l_float32 *pmean, l_float32 *pvar, l_float32 *prvar)
numaSimpleStats()
NUMA * numaMakeHistogramClipped(NUMA *na, l_float32 binsize, l_float32 maxsize)
numaMakeHistogramClipped()
NUMA * numaMakeHistogram(NUMA *na, l_int32 maxbins, l_int32 *pbinsize, l_int32 *pbinstart)
numaMakeHistogram()
l_ok numaDiscretizeSortedInBins(NUMA *na, l_int32 nbins, NUMA **pnabinval)
numaDiscretizeSortedInBins()
l_ok numaGetStatsUsingHistogram(NUMA *na, l_int32 maxbins, l_float32 *pmin, l_float32 *pmax, l_float32 *pmean, l_float32 *pvariance, l_float32 *pmedian, l_float32 rank, l_float32 *prval, NUMA **phisto)
numaGetStatsUsingHistogram()