This is DataCounter.m in view mode; [Download] [Up]
// By Judy D. Halchin, Educational Computing Services, Allegheny College.
// You may freely copy, distribute and reuse this code.
// Allegheny College and the author disclaim any warranty of any kind,
// expressed or implied, as to its fitness for any particular use.
// This work was partially supported by a Teacher Preparation grant from the
// National Science Foundation.
#import "DataCounter.h"
#import <stdlib.h>
#import <stdio.h>
#import <math.h>
@implementation DataCounter
- (float *)countFrequenciesForData:(int *)data
count:(int)count
min:(int *)dataMin
max:(int *)dataMax
minMaxProvided:(BOOL)minMaxProvided
{
int datum, numFreq;
float *frequencies;
//find minimum and maximum data if they weren't provided
if (!minMaxProvided)
{
*dataMax = data[0];
*dataMin = data[0];
for (datum = 1; datum < count; datum++)
{
if (data[datum] > *dataMax)
*dataMax = data[datum];
if (data[datum] < *dataMin)
*dataMin = data[datum];
}
}
//set up the list of frequencies
numFreq = *dataMax - *dataMin + 1;
frequencies = (float *)malloc(numFreq * sizeof(float));
for (datum = 0; datum < numFreq; datum++)
frequencies[datum] = 0;
for (datum = 0; datum < count; datum++)
frequencies[data[datum]-*dataMin] =
frequencies[data[datum]-*dataMin] + 1;
return frequencies;
}
- (float *)countFrequenciesForData:(float *)data
count:(int)count
numGroups:(int)numGroups
mins:(float *)mins
maxs:(float *)maxs
{
int group, datum;
float *frequencies;
frequencies = (float *)malloc(numGroups * sizeof(float));
for (group = 0; group < numGroups; group++)
frequencies[group] = 0;
for (datum = 0; datum < count; datum++)
{
for (group = 0; (data[datum] > maxs[group]) && (group < numGroups);
group++);
if (group < numGroups)
if (data[datum] >= mins[group])
frequencies[group] = frequencies[group] + 1;
}
return frequencies;
}
- (float *)countFrequenciesForData:(float *)data
count:(int)count
numIntervals:(int)numIntervals
boundaries:(float *)boundaries
{
int datum, interval;
float *frequencies;
frequencies = (float *)malloc(numIntervals * sizeof(float));
for (interval = 0; interval < numIntervals; interval++)
frequencies[interval] = 0;
for (datum = 0; datum < count; datum++)
{
for (interval = 0; (data[datum] > boundaries[interval+1]) &&
(interval < numIntervals); interval++);
if (interval < numIntervals)
if (data[datum] > boundaries[interval])
frequencies[interval] = frequencies[interval] + 1;
}
return frequencies;
}
- findNumIntervals:(int *)numIntervals
boundaries:(float **)boundaries
forData:(float *)data
count:(int)count
intervalWidth:(float)intervalWidth
{
float max, min, powerOfTen=0;
int numberOfDigits, datum;
//find min and max data values
min = data[0];
max = data[0];
for (datum = 1; datum < count; datum++)
if (data[datum] < min)
min = data[datum];
else
if (data[datum] > max)
max = data[datum];
//find number of digits of accuracy of the data
numberOfDigits = -6; //we're counting digits right of the decimal
for (datum = 0; datum < count; datum++)
{
powerOfTen = pow(10, -numberOfDigits);
while (fabs(data[datum] - [self round:data[datum] to:powerOfTen])
> 1e-6)
{
numberOfDigits++;
powerOfTen = pow(10, -numberOfDigits);
}
}
//find bottom boundary
*boundaries = (float *)malloc( ((max-min)/intervalWidth+2) *
sizeof(float));
**boundaries = min - 0.5 * powerOfTen;
//generate groups
*numIntervals = 1;
while (max > *((*boundaries) + *numIntervals - 1))
{
*((*boundaries) + *numIntervals) =
*((*boundaries) + (*numIntervals) - 1) + intervalWidth;
(*numIntervals)++;
}
*numIntervals = (*numIntervals) - 1;
return self;
}
- (float)round:(float)number to:(float)accuracy
{
if (number >= 0)
return (float)(int)(number/accuracy + 0.5) * accuracy;
else
return (float)(int)(number/accuracy - 0.5) * accuracy;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.