如何计算Processing / Arduino中的统计模式

时间:2011-10-25 21:50:45

标签: processing arduino mode

我是一名设计老师,试图帮助学生解决编程问题,所以我编写了有趣的代码,但我不是专家。

她需要在使用耦合到Arduino的传感器的数据构建的数据集中找到mode(最常见的值),然后根据结果激活一些函数。

除了如何在Arduino中计算模式外,我们已经弄明白了。我发现帖子 Get the element with the highest occurrence in an array 解决了JavaScript中的问题,但我无法“移植”它。

2 个答案:

答案 0 :(得分:2)

我将链接帖子中的代码移植到Processing,但它仅限于 int 数组。 我希望有所帮助。

void setup()
{
    int[] numbers = {1, 2, 3, 2, 1, 1, 1, 3, 4, 5, 2};
    println(mode(numbers));
}


int mode(int[] array) {
    int[] modeMap = new int [array.length];
    int maxEl = array[0];
    int maxCount = 1;

    for (int i = 0; i < array.length; i++) {
        int el = array[i];
        if (modeMap[el] == 0) {
            modeMap[el] = 1;
        }
        else {
            modeMap[el]++;
        }

        if (modeMap[el] > maxCount) {
            maxEl = el;
            maxCount = modeMap[el];
        }
    }
    return maxEl;
}

答案 1 :(得分:2)

我使用HashMap来替换js {}动态对象实例并浮动,但@ weberik的端口看起来更直接。

void setup() {
    int numValues = 10;
    float[] values = new float[numValues]; //Create an empty sample array
    for(int i = 0 ; i < numValues ; i++) values[i] = random(0.0,100.0); //Populate it with random values.
    println("mode: " + mode(values));
}

float mode(float[] source) {
    if (source.length == 0)
        return -1;
    HashMap<Float,Integer> modeMap = new HashMap<Float,Integer>();
    float result = source[0];
    int maxCount = 1;
    for (int i = 0; i < source.length; i++) {
        float el = source[i];
        if (modeMap.get(el) == null)
            modeMap.put(el,1);
        else
            modeMap.put(el,modeMap.get(el)+1);
        if (modeMap.get(el) > maxCount) {
            result = el;
            maxCount = modeMap.get(el);
        }
    }
    return result;
}

您已经提到了传感器输入,因此我假设数据将被连续采样,因此值可以以一定的间隔存储,然后发送到处理模式。 只是一个疯狂的猜测,但她不是想平均/平滑传感器读数吗? 如果是这样,她可以在Arduino中的数组中缓存一些值(比如10)并在每次添加新值时获得平均值:

int vals[10]; //Array to store caches values.

void setup() {
    Serial.begin(9600);
    for (int i=0 ; i < 10 ; i++) 
        vals[i] = 0; //Init with zeroes
}

void loop() {
    delay(100);
    int currentVal = average(analogRead(0));
    //Serial.print(currentVal,BYTE);
    Serial.println(currentVal);
}

int average(int newVal) {
    int total = 0; //Used to store the addition of all currently cached values
    for(int i = 9; i > 0; i--) { //Loop backwards from the one before last to 0
        vals[i] = vals[i-1]; //Overwrite the prev. value with the current(shift values in array by 1)
        total += vals[i]; //Add to total
    }
    vals[0] = newVal; //Add the newest value at the start of the array
    total += vals[0]; //Add that to the total as well
    return total *= .1; //Get the average (for 10 elemnts) same as total /= 10, but multiplication is faster than division.
}