imjoshua
一般會員
![](./myimg/board/mystar_empty.gif)
![](images/icon_photo_none.gif) 發表:36 回覆:21 積分:11 註冊:2005-03-16
發送簡訊給我
|
各位前輩您好!!
小弟之前被大大指點後化繁而簡的算出六個Image投影量的平均值及標準差;
但小弟希望這六筆的投影量必須變異情況不大,故必須將這些較不具代表性的投影量予以剔除即用統計的方法"剔除信賴區間以外的筆跡投影量"。也就是90%的信賴區間為μ±1.64σ 因此以下是簡單程式碼:(部份由m58610大大提供) int Array[6] = {6812,5630,5823,6020,5422,5902};
float m = 0; //平均值
float div = 0; //標準差
int N = 0 ; for(int i = 0; i < 6; i )
m = m Array[i];
m = m / 6.0; for(int i = 0; i < 6; i )
div = div pow((Array[i] - m), 2);
div = sqrt(div / 6.0);
Edit1->Text = m;
Edit2->Text = div; for(int i =0; i<6 ; i )
if((Array[i] > m-1.64*div) && (Array[i] < m 1.64*div)) //是否有符合信賴區間
N ; //符合信賴區間的筆數 Edit3->Text = N; 由上可知符合信賴區間的有5筆
我想問的是如何在剔除信賴區間後重新計算平均值與標準差
(註:如果在不知會剔除幾筆的情況下…小弟就不知如何舉一反三了@@)
煩請大大給小弟提示謝謝!! 打擾您保貴的閱讀時間在此跟您說聲抱歉!! 發表人 - imjoshua 於 2005/06/08 23:41:13
------ joshua
|
fusung
中階會員
![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif)
![](images/icon_photo_none.gif) 發表:26 回覆:169 積分:99 註冊:2003-11-25
發送簡訊給我
|
Hello, imjoshua: 參考看看囉! ![]() < class="code"> //--------------------------------------------------------------------------- #include
#pragma hdrstop
#include <math>
#include
#include "Unit1.h"
using namespace std;
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
float mymean(int* Array, int size);
float mysigma(int* Array, int size, float m);
vector conf_data(int* Array, int size, float m, float div); void __fastcall TForm1::Button1Click(TObject *Sender)
{
int Array[] = {6812,5630,5823,6020,5422,5902};
int size; //資料長度
float m = 0; //平均值
float div = 0; //標準差
int N = 0 ;
vector in_data; // 在信賴區間內的資料 size = sizeof(Array)/sizeof(Array[0]); //計算資料長度
m = mymean(Array, size);
Edit1->Text = FloatToStr(m); div = mysigma(Array, size, m);
Edit2->Text = FloatToStr(div); in_data = conf_data(Array, size, m, div);
N = in_data.size();
Edit3->Text = IntToStr(N); // 複製 in_data(向量形式) 至 copydata(矩陣形式)
int *copydata = new int[N]; //剔除信賴區間以外的投影量
copy(in_data.begin(),in_data.end(),copydata); m = mymean(copydata, N);
Edit4->Text = FloatToStr(m); div = mysigma(copydata, N, m);
Edit5->Text = FloatToStr(div); delete copydata;
}
//--------------------------------------------------------------------------- float mymean(int* Array, int size)
{
float m = 0; //平均值
for(int i = 0; i < size; i++)
m += Array[i];
m = m / size;
return m;
}
//--------------------------------------------------------------------------- float mysigma(int* Array, int size, float m)
{
float div = 0; //標準差
for(int i = 0; i < size; i++)
div = div + pow((Array[i] - m), 2);
div = sqrt(div / size);
return div;
}
//--------------------------------------------------------------------------- vector conf_data(int* Array, int size, float m, float div)
{
int N; // 落在信賴區間的資料個數
vector in_data; // 落在信賴區間內的資料
for(int i =0; i m-1.64*div) && (Array[i] < m 1.64*div)) //是否有符合信賴區間
in_data.push_back(Array[i]); // 滿足的堆疊至in_data
}
N = in_data.size();
if (N > 0){
return in_data;
}
} /*
The first step toward proving things for yourself is to understand how others have done it before!
*/
------
The first step toward proving things for yourself is to understand how others have done it before!
|
fusung
中階會員
![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif)
![](images/icon_photo_none.gif) 發表:26 回覆:169 積分:99 註冊:2003-11-25
發送簡訊給我
|
Hello,imjoshua: 因為計算落在信賴區間內的副程式conf_data需要(always)回傳一vector, 但如果N>0不成立時,則不會回傳任何值, 這與自己上面定義的副程式相違背,同時被compiler檢查出來 ![]() 如果把下面紅色部分遮起來,應該就可以修正這個 > < class="code">
vector conf_data(int* Array, int size, float m, float div)
{
// int N; // 落在信賴區間的資料個數
vector in_data; // 落在信賴區間內的資料
for(int i =0; i m-1.64*div) && (Array[i] < m 1.64*div)) //是否有符合信賴區間
in_data.push_back(Array[i]); // 滿足的堆疊至in_data
}
// N = in_data.size();
// if (N > 0){ <-錯誤,因為小於等於零情況應該不會發生
return in_data;
// }
}
/*
The first step toward proving things for yourself is to understand how others have done it before!
*/
------
The first step toward proving things for yourself is to understand how others have done it before!
|