我是一名设计老师,试图帮助学生解决编程问题,所以我编写了有趣的代码,但我不是专家。
她需要在使用耦合到Arduino的传感器的数据构建的数据集中找到mode(最常见的值),然后根据结果激活一些函数。
除了如何在Arduino中计算模式外,我们已经弄明白了。我发现帖子 Get the element with the highest occurrence in an array 解决了JavaScript中的问题,但我无法“移植”它。
答案 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.
}