C++線性擬合及相關係數求取

函數功能:線性擬合及相關係數計算。

  • 代碼
#include "stdafx.h"
#include
#include

// 函數聲明
double ArrayCorrcoef(int d1[], int d2[], int dataL, int dataW);
void ArrayLinearFit(int x[], int y[], int m, int n, double &a, double &b); 

using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
    int a1[5][2] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    int b1[5][2] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 8 };
    cout << "coe=" << ArrayCorrcoef(*a1, *b1, 5, 2) << endl;
    double a, b;
    ArrayLinearFit(*a1,*b1,5,2,a,b);
    cout << "a=" << a << endl;
    cout << "b=" << b << endl;

    //結束
    system("pause");
    return 0;
}

// 函數實現過程
double ArrayCorrcoef(int d1[], int d2[], int dataL, int dataW)
{
    int i;
    int xy = 0, x = 0, y = 0, xsum = 0, ysum = 0;
    double corrc;
    for (i = 0; i < dataL*dataW; i++)
    {
        xsum += d1[i];
        ysum += d2[i];
    }
    for (i = 0; i < dataL*dataW; i++)
    {
        x = x + (dataL*dataW*d1[i] - xsum)*(dataL*dataW*d1[i] - xsum);
        y = y + (dataL*dataW*d2[i] - ysum)*(dataL*dataW*d2[i] - ysum);
        xy = xy + (dataL*dataW*d1[i] - xsum)*(dataL*dataW*d2[i] - ysum);
    }
    corrc = double(abs(xy)) / (sqrt(x) * sqrt(y));
    return corrc;
}

void ArrayLinearFit(int x[], int y[], int m, int n, double &a, double &b)
{
    int i;
    int xsum = 0, ysum = 0, xysum = 0, x2sum = 0;
    for (i = 0; i < m*n; i++)
    {
        xsum = xsum + x[i];
        ysum = ysum + y[i];
        xysum = xysum + x[i] * y[i];
        x2sum = x2sum + x[i] * x[i];
    }
    a = double(m*n*xysum - xsum*ysum) / (m*n*x2sum - xsum*xsum);   //這裏一定要進行數據類型轉換
    b = double(ysum - a*xsum) / (m*n);
    return;
}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章