我想偷懒,谁能给我一个标准差的算法,非常感谢!(100分)

  • 主题发起人 主题发起人 BuddyWang
  • 开始时间 开始时间
B

BuddyWang

Unregistered / Unconfirmed
GUEST, unregistred user!
我想偷懒,谁能给我一个标准差的算法,非常感谢!
 
告诉我意思,我写给你
 
给你一段N年前的程序,不过因为没有注释,现在连我也看不懂了。
longdo
uble TFormMain::GetVarAbsDev(AnsiString VarName,int DataNoAdd,bool BolStdev)
{
int ix,DataSum;
AnsiString StrX;
longdo
uble d1,d2,dt1,dt2,d3;
if(bError)
return 0;
StrX=VarName;
dt2=GetVarSum(VarName,DataNoAdd,1);
DataSum=0;
d1=d2=0;
for(ix=0;
ix<=GetRangeMin(StrX,DataNoAdd,true)-GetRangeMin(StrX,DataNoAdd);
ix++)
{
bError=false;
dt1=GetVarData(StrX,ix,DataNoAdd);
if(bError==false)
{
d3=fabsl(dt1-dt2);
d1+=d3;
d2+=(d3*d3);
DataSum++;
}
}
bError=false;
if(DataSum<2)
{
bError=true;
return 0;
}
d1/=DataSum;
d2=sqrtl(d2/(DataSum-1)/DataSum);
if(BolStdev==true)
return d2;
else
return d1;
}
 
看了一会,好像又看懂了,修改如下:
//求偏差,Datas为数据数组,如果bStdev=True,返回标准差,否则返回绝对差
function GetVarAbsDev(Datas: array ofdo
uble;
bStdev: Boolean):do
uble;
var
I,C: Integer;
d1,d2,dt1,dt2,d3:do
uble;
begin
C :=Length(Datas);
if C<2 then
raise Exception.Create('Data Count < 2');
dt2 := 0;
//求平均值
for I:=0 to High(Datas)do
dt2 := dt2+Datas;
dt2 := dt2/C;
d1 := 0;
d2 :=0;
for I:=0 to High(Datas)do
begin
dt1 := Datas;
d3 := abs(dt1-dt2);
d1 := d1+d3;
d2 := d2+d3*d3;
end;

d1 := d1 /C;
d2 := sqrt(d2/(C-1)/C);
if bStdev then
Result := d2
else
Result := d1;
end;

你试试可否。
我又改一处:求平均值
 
多人接受答案了。
 
后退
顶部