这是我从书上看到的代码,但是第一个函数chlk(乔利斯基分解法)就已经错误了。
#include<stdio.h>
#include<iostream>
#include<cmath>
#include<iomanip>
using namespace std;
int chlk(double a[], int n, int m, double d[])
{
int i, j, k, u, v;
if ((a[0] + 1.0 == 1.0) || (a[0] < 0.0))return (0);
a[0] = sqrt(a[0]);
for (j = 1; j <= n - 1; j++)a[j] = a[j] / a[0];
for (i = 1; i <= n - 1; i++)
{
u = i * n + i;
for (j = 1; j <= i; j++)
{
v = (j - 1) * n + i;
a[u] = a[u] - a[v] * a[v];
}
if ((a[u] + 1.0 == 1.0) || (a[u] < 0.0)) return(0);
a[u] = sqrt(a[u]);
if (i != (n - 1))
{
for (j = i + 1; j <= n - 1; j++)
{
v = i * n + j;
for (k = 1; k <= i; k++)a[v] = a[v] - a[(k - 1) * n + i] * a[(k - 1) * n + j];
a[v] = a[v] / a[u];
}
;
}
}
for (j = 0; j <= m - 1; j++)
{
d[j] = d[j] / a[0];
for (i = 1; i <= n - 1; i++)
{
u = i * n + i;
v = i * m + j;
for (k = 1; k <= i; k++)
d[v] = d[v] - a[(k - 1) * n + i] * d[(k - 1) * m + j];
d[v] = d[v] / a[u];
}
}
for (j = 0; j < m - 1; j++)
{
u = (n - 1) * m + j;
d[u] = d[u] / a[n * n - 1];
for (k = n - 1; k >= 1; k--)
{
u = (k - 1) * m + j;
for (i = k; i <= n - 1; i++)
{
v = (k - 1) * n + i;
d[u] = d[u] - a[v] * d[i * m + j];
}
v = (k - 1) * n + k - 1;
d[u] = d[u] / a[v];
}
}
return (2);
}
/*void sqt2(int m, int n, double x[], double y[], double a[], double data[4], double v[])
{
int i, j, k, mm;
double q, e, u, p, yy, s, r, pp, * b;
b = new double[(m + 1) * (m + 1)];
mm = m + 1;
b[mm * mm - 1] = n;
for (j = 0; j < m - 1; j++)
{
p = 0.0;
for (i = 0; i < n - 1; i++)p = p + x[j * n + i];
b[(m * mm) + j] = p;
b[(j * mm) + m] = p;
}
for (i = 0; i <= m - 1; i++)
for (j = 0; j <= m - 1; j++)
{
p = 0.0;
for (k = 0; k <= n - 1; k++)p = p + x[i * n + k] * x[j * n + k];
b[j * mm + i] = p;
b[i * mm + j] = p;
}
a[m] = 0.0;
for (i = 0; i <= n - 1; i++)a[m] = a[m] + y[i];
for (i = 0; i <= m - 1; i++)
{
a[i] = 0.0;
for (j = 0; j <= n - 1; j++)a[i] = a[i] + x[i * n + j] * y[j];
}
chlk(b, mm, 1, a);
yy = 0.0;
for (i = 0; i <= n - 1; i++)yy = yy + y[i] / n;
q = 0.0; e = 0.0; u = 0.0;
for (i = 0; i <= n - 1; i++)
{
p = a[m];
for (j = 0; j <= m - 1; j++) p = p + a[j] * x[j * n + i];
q = q + (y[i] - p) * (y[i] - p);
e = e + (y[i] - yy) * (y[i] - yy);
u = u + (yy - p) * (yy - p);
}
s = sqrt(q / n);
r = sqrt(1.0 - q / e);
for (j = 0; j <= m - 1; j++)
{
p = 0.0;
for (i = 0; i <= n - 1; i++)
{
pp = a[m];
for (k = 0; k <= m - 1; k++)
if (k != j)pp = pp + a[k] * x[k * n + i];
p = p + (y[i] - pp) * (y[i] - pp);
}
v[j] = sqrt(1.0 - q / p);
}
data[0] = q;
data[1] = s;
data[2] = r;
data[3] = u;
delete[]b;
return;
}
*/
int main()
{
int i;
double a[4][4] = { {5.0,7.0,6.0,5.0},{7.0,10.0,8.0,7.0},{6.0,8.0,1.0,9.0},{5.0,7.0,9.0,10.0} };
double d[4][2] = { {23.0,92.0},{32.0,128.0},{33.0,132.0},{31.0,124.0} };
i = chlk(&a[0][0], 4, 2, &d[0][0]);
//if (i <= 0)return 0;
for (i = 0; i <= 3; i++)
{
cout << "x(" << i << ")=" << setw(15) << d[i][0] << setw(15) << d[i][1] << endl;
}
/*double data[4], a[4], v[3];
double x[3][5] = { {1.1,1.0,1.2,1.1,0.9},{2.0,2.0,1.8,1.9,2.1},{3.2,3.2,3.0,2.9,2.9} };
double y[5] = { 10.1,10.2,10.0,10.1,10.0 };
sqt2(3, 5, &x[0][0], y, a, data, v);
cout << "回归系数" << endl;
for (int i = 0; i <= 3; i++) cout << "a[" << i << "] = " << a[i] << endl;
cout << "偏差平方和:" << data[0] << endl;
cout << "平均标准偏差:" << data[1] << endl;
cout << "复相关系数" << data[2] << endl;
cout << "回归平方和:" << data[3] << endl;
cout << "偏相关系数:" << endl;
for (int i = 0; i <= 2; i++) cout << "v[" << i << "]=" << v[i] << endl;*/
return 0;
}
/**/处错误答案:
/**/实际答案: