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

如何计算Processing/Arduino中的统计模式,processing,arduino,mode,Processing,Arduino,Mode,我是一名设计老师,试图帮助学生解决编程难题,所以我编写代码是为了好玩,但我不是专家 她需要在使用来自耦合到Arduino的传感器的数据构建的数据集中找到(最频繁的值),然后根据结果激活一些函数 除了如何计算Arduino中的模式,我们已经解决了大部分问题。我在JavaScript中找到了解决问题的帖子,但我无法“移植”它。我将链接帖子中的代码移植到,但它仅限于int数组。 我希望这有帮助 void setup() { int[] numbers = {1, 2, 3, 2, 1, 1,

我是一名设计老师,试图帮助学生解决编程难题,所以我编写代码是为了好玩,但我不是专家

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


除了如何计算Arduino中的模式,我们已经解决了大部分问题。我在JavaScript中找到了解决问题的帖子,但我无法“移植”它。

我将链接帖子中的代码移植到,但它仅限于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;
}
void setup()
{
int[]数字={1,2,3,2,1,1,1,3,4,5,2};
println(模式(数字));
}
int模式(int[]数组){
int[]modeMap=newint[array.length];
int maxEl=数组[0];
int maxCount=1;
for(int i=0;imaxCount){
maxEl=el;
maxCount=模式映射[el];
}
}
返回最大值;
}
我使用了一个替换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;
}
void setup(){
int numValues=10;
float[]values=new float[numValues];//创建一个空样本数组
对于(int i=0;imaxCount){
结果=el;
maxCount=modeMap.get(el);
}
}
返回结果;
}
您已经提到了传感器输入,所以我假设数据将连续采样,因此可以以一定的间隔存储值,然后发送到处理模式。 这只是一个粗略的猜测,但她不想平均/平滑传感器读数吗? 如果是这样,她可以在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.
}
int-vals[10]//用于存储缓存值的数组。
无效设置(){
Serial.begin(9600);
对于(int i=0;i<10;i++)
vals[i]=0;//带零的Init
}
void循环(){
延迟(100);
int currentVal=平均值(模拟读数(0));
//串行打印(当前值,字节);
Serial.println(currentVal);
}
整数平均值(整数新值){
int total=0;//用于存储所有当前缓存值的相加
对于(inti=9;i>0;i--){//从上一个向后循环到0
VAL[i]=VAL[i-1];//用当前值覆盖上一个值(将数组中的值移位1)
总计+=VAL[i];//添加到总计
}
vals[0]=newVal;//在数组的开头添加最新的值
总计+=VAL[0];//也将其添加到总计中
return total*=.1;//获取与total/=10相同的平均值(对于10个元素),但乘法比除法快。
}

想到在micrcontroller上使用一个模板,我的心都要流血了。效率低下令人痛苦。在这一点上,您确实展示了如何移植代码,如果它能在arduino上编译,我不确定。谢谢George,非常周到的回复。事实上,她将不得不平均一点读数,你的解决方案是明确的,让我了解了HashMaps!你认为这可能是在Arduino单独完成的(不包括加工部分)?不要给我看代码,但答案是:)Kortuk,关于效率,你是对的,但这不是Arduino的目标…它应该让使用微控制器的人变得简单/不那么害怕。关于移植的代码,这是为了处理/Java,而不是Arduino,因此它显然不会在Arduino上运行,但是可以通过内置的串行库将值从Arduino发送到处理。谢谢George。最后,我根据之前的回答回答了一个问题,但是你的回答让我了解了哈希映射!谢谢weberik,您的解决方案清晰易懂!我说这段代码要求原始数组中的元素小于原始数组的长度,对吗?这个解决方案是错误的,不是原始JS代码中的端口。在原始JS代码中,modeMap是一个映射(一个JavaScript对象),如果该键不存在,将自动添加当前模式的新条目(键)。正如@j_v_wow_d所述,只有在数组元素的值总是小于数组长度的情况下,此代码才会正常工作。您所指的“数据集”采用什么形式?这是一个(Arduino)整数数组吗?嗨,Matthew。我们还没有对它进行编码,但是是的,它可能是一个整数数组,尽管我们也可能采用浮点方式。她(学生)将测量物体的速度,并据此采取行动。对于scale原型,速度也将“缩小”,因此我们必须测试整数是否合适,或者我们是否应该使用十进制数进行计算。如果使用浮点数,我会担心可能没有单一的“模式”(即每个结果可能不同)。这可能是一个问题,还是我们可以假设在这种情况下不会发生?