在我的应用程序中,我正在从EEG耳机读取外部值(int)。
我认为该值每秒读取一次,但从我的logcat报告来看,它似乎被读取的次数多于此。
这破坏了我的意图,因为我想计算这些值的平均值。我试图这样做使用增量操作符称为计数。
请注意,从耳机中读取的值只能是1-100,因此平均值的输出必须是不正确的,因为它是168。
我做错了什么?
当前代码:记录值的位置:
case TGDevice.MSG_MEDITATION:
//BELOW CODE RELATES TO SAVING AN AVERAGE VALUE
meditationValues.add(msg.arg1);
count++;
for(int i = 0; i < meditationValues.size(); i++){
totalofMedLevels += meditationValues.get(i);
Log.d("Total", "Total : " + totalofMedLevels);
Log.d("Count ", "Count: " + count);
}
计算平均:public void getAverageValue(){
//stop device so that the values can be recorded
device.stop();
averageMedLevel=totalofMedLevels/count;
Log.d("Average level:", "Average: " + averageMedLevel);
}
Logcat输出:
总:07-14 14:16:44.312: D/Total(30422): Total : 301
07-14 14:16:45.313: D/Total(30422): Total : 301
07-14 14:16:45.313: D/Total(30422): Total : 301
07-14 14:16:45.313: D/Total(30422): Total : 301
07-14 14:16:45.323: D/Total(30422): Total : 301
07-14 14:16:45.323: D/Total(30422): Total : 301
07-14 14:16:45.323: D/Total(30422): Total : 301
07-14 14:16:45.323: D/Total(30422): Total : 342
07-14 14:16:45.323: D/Total(30422): Total : 406
07-14 14:16:45.323: D/Total(30422): Total : 456
07-14 14:16:45.323: D/Total(30422): Total : 496
07-14 14:16:46.314: D/Total(30422): Total : 496
07-14 14:16:46.314: D/Total(30422): Total : 496
07-14 14:16:46.314: D/Total(30422): Total : 496
07-14 14:16:46.314: D/Total(30422): Total : 496
07-14 14:16:46.314: D/Total(30422): Total : 496
07-14 14:16:46.314: D/Total(30422): Total : 496
07-14 14:16:46.324: D/Total(30422): Total : 537
07-14 14:16:46.324: D/Total(30422): Total : 601
07-14 14:16:46.324: D/Total(30422): Total : 651
07-14 14:16:46.324: D/Total(30422): Total : 691
07-14 14:16:46.324: D/Total(30422): Total : 725
07-14 14:16:47.285: D/Total(30422): Total : 725
07-14 14:16:47.285: D/Total(30422): Total : 725
07-14 14:16:47.285: D/Total(30422): Total : 725
07-14 14:16:47.285: D/Total(30422): Total : 725
07-14 14:16:47.285: D/Total(30422): Total : 725
数:07-14 14:16:47.285: D/Count(30422): Count: 12
07-14 14:16:47.285: D/Count(30422): Count: 12
07-14 14:16:47.285: D/Count(30422): Count: 12
07-14 14:16:47.285: D/Count(30422): Count: 12
07-14 14:16:47.285: D/Count(30422): Count: 12
07-14 14:16:47.295: D/Count(30422): Count: 12
07-14 14:16:47.295: D/Count(30422): Count: 12
07-14 14:16:47.295: D/Count(30422): Count: 12
07-14 14:16:47.295: D/Count(30422): Count: 12
07-14 14:16:47.295: D/Count(30422): Count: 12
07-14 14:16:47.295: D/Count(30422): Count: 12
07-14 14:16:48.286: D/Count(30422): Count: 13
07-14 14:16:48.286: D/Count(30422): Count: 13
07-14 14:16:48.286: D/Count(30422): Count: 13
07-14 14:16:48.296: D/Count(30422): Count: 13
07-14 14:16:48.296: D/Count(30422): Count: 13
07-14 14:16:48.296: D/Count(30422): Count: 13
07-14 14:16:48.296: D/Count(30422): Count: 13
07-14 14:16:48.296: D/Count(30422): Count: 13
07-14 14:16:48.296: D/Count(30422): Count: 13
07-14 14:16:48.296: D/Count(30422): Count: 13
07-14 14:16:48.296: D/Count(30422): Count: 13
07-14 14:16:48.296: D/Count(30422): Count: 13
平均:07-14 14:16:53.281: D/Average level:(30422): Average: 168
编辑(尝试只保存大于0的值):
if((msg.arg1)!=0){
meditationValues.add(msg.arg1);
}
for(int i = 0; i < meditationValues.size(); i++){
//totalofMedLevels += meditationValues.get(i);
totalofMedLevels+=msg.arg1;
count++;
Log.d("Total", "Total : " + totalofMedLevels);
Log.d("Count ", "Count: " + count);
}
似乎每次你得到一个新值,你遍历整个值列表,并再次将它们全部添加到"totalofMedLevels"。用
替换上面的代码totalofMedLevels += msg.arg1;
count++;
应该能解决问题。如果没有,说明您没有提供足够的信息(也就是说,没有显示足够的代码)。
我想开关箱是从Listener
调用的。所以每次调用这个时,你都在迭代List
的大小并将值添加到产生问题的类变量中。将代码修改为:
case TGDevice.MSG_MEDITATION:
meditationValues.add(msg.arg1);
break;
public void getAverageValue(){
device.stop();
for(int i = 0; i <= meditationValues.size(); i++){
totalofMedLevels += meditationValues.get(i);
Log.d("Total", "Total : " + totalofMedLevels);
Log.d("Count ", "Count: " + i + 1);
}
averageMedLevel = totalofMedLevels/meditationValues.size();
Log.d("Average level:", "Average: " + averageMedLevel);
}
为什么不直接使用数组的大小:averageMedLevel=totalofMedLevels/meditationValues.size()
清理你的代码,答案就会变得显而易见。
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
/**
* @author DShaw
*
*/
public class Meditation {
private List<Integer> values;
public Meditation()
{
values = new ArrayList<Integer>();
}
public double getSum() {
double sum = 0;
for (Integer i:values)
sum = sum + i;
return sum;
}
public int getCount()
{
return values.size();
}
public void addValue(Integer value)
{
values.add(value);
}
public Double getAverage()
{
return getSum()/getCount();
}
public static void main(String[] args)
{
Meditation m = new Meditation();
Random r = new Random(System.currentTimeMillis());
for (int i=0; i < 1000; i++)
{
Integer randInt = r.nextInt(100);
m.addValue(randInt);
System.out.println("Average for " +
m.getCount() +
" items: " +
m.getAverage());
}
}
}
你得到的值比预期的/可能的大,因为你的分母(计数)不是它应该是什么。假设你在数组中有4个值0,0,100,100,平均值显然是50(200/4),但如果由于某种原因,分母是错误的,平均值似乎更大。例如,如果你把项目数错为3,那么平均值似乎是~66或更糟,只有2被计算200/2 = 100。
既然计数是问题,我认为:
如果你想使用一个变量(在你的例子中是count)来跟踪数组的大小,那么你需要在for循环中增加它。
或者,添加设置它等于原始数组的大小
meditationValues.add(msg.arg1);
count++;
for(int i = 0; i < meditationValues.size(); i++){
totalofMedLevels += meditationValues.get(i);
Log.d("Total", "Total : " + totalofMedLevels);
Log.d("Count ", "Count: " + count);
case++;
}
或将数组的大小添加到for循环后的count变量中。
for(...){
.....
.....
}
case += meditationValues.size();
认为,