关于C++计算平均值和方差

时间:2021-05-07 00:37:40
for(i=1;i<=15;i++)//i表示各个因素,即数据库中i列数据
{
    for(ii=0;ii<=100;ii++) //ii表示数据库中有ii行数据
   {
ave[i][ii]=0; //设置初始平均值为0
         tvap[i][ii]=0;    //设置初始方差的平方为0
   }
   Total[i]=0;             //设置统计各列中非0数据的数组为0
}

p=0;
m_pSet->Move(57);
for(ii=1;ii<=2;ii++)       //读取前两行数据    
{
    p++;
    data[1][p]=m_pSet->m_...; 
    ...
    data[15][p]=m_pSet->m_...;   
    m_pSet->MoveNext();  //读取15列数据
    for(i=1;i<=15;i++)
   {
       if(data[i][p]>0)
       {
Total[i]++;                                  //当data[i][p]非0时,Total[i]累计一次
tave[i][p]=data[i][p]-ave[i][p-1];
ave[i][p]=ave[i][p-1]+tave[i][p]/Total[i];   //递推计算平均值
tvap[i][p]=tvap[i][p-1]+pow(tave[i][p],2)/Total[i];
vap[i][p]=sqrt((1-1/Total[i])*tave[i][p]);   //计算方差
       }
       else
       {
ave[i][p]=ave[i][p-1];   //当data[i][p]=0时,平均值选取上一次计算所得
vap[i][p]=vap[i][p-1];   //当data[i][p]=0时,方差选取上一次计算所得
       }
    }
这个数据库中,除了第二行数据中data[8][2]、data[9][2]、data[10][2]为0,其他值都为正数。
但是单步跟踪的时候发现 
在i=1次循环时,ave[15][1]被赋值为1
在i=2次循环时,ave[15][2]被赋值为1,而之前已经设置ave[i][ii]=0
并且到ii=2的循环时,Total[1]变成了1+ave[15][1]的值,而非预想中的2.这个程序为什么会出现这样的问题?

3 个解决方案

#1


注意数组下标是从0开始的
ave[15][1]指的是第16行的第二个元素

然后程序开头的初始化:
for(i=1;i<=15;i++)//你确定ave有16行?
for(ii=0;ii<=100;ii++) //你确定ave有101列?



不知道我说的正不正确,总之我很晕……

#2


是数组的问题,一个是从0开始的一个是从1开始的
所以数值移位了
而且算式中间写错了一个
所以结果一直是错的
谢谢 linsj585

#3


呵,不用客气,找到错误就好

#1


注意数组下标是从0开始的
ave[15][1]指的是第16行的第二个元素

然后程序开头的初始化:
for(i=1;i<=15;i++)//你确定ave有16行?
for(ii=0;ii<=100;ii++) //你确定ave有101列?



不知道我说的正不正确,总之我很晕……

#2


是数组的问题,一个是从0开始的一个是从1开始的
所以数值移位了
而且算式中间写错了一个
所以结果一直是错的
谢谢 linsj585

#3


呵,不用客气,找到错误就好