y">//А - покажчик на перший множник
//В - покажчик на другий множник
//n, m - розмірність матриць
//R - покажчик на результат
void mulMatr (double ** A, double ** B, int n, int m, double ** R)
{i, j, k; (i=0; i lt; n; i ++) (j=0; j lt; m; j ++) (k=0; k lt; m; k ++ ) [i] [j]=R [i] [j] + A [i] [k] * B [k] [j];
}
//Обчислення кореня числа
//Аргументи:
//x - число, квадратний корінь якого треба вирахувати
//Примітка: обчислення ведеться методом Ньютона (doublex)
{i; res=1; (i=0; i lt; 100; i ++)=(res + x/res)/2; res;
}
//QR-алгоритм
//Аргументи:
//A - покажчик на вхідну квадратну матрицю nxn
//n - розмірність даних
//R - покажчик на результуючу матрицю з СЧ матриці А на
//головної діагоналі розмірності nxn
//Q - покажчик на результуючу матрицю СВ матриці А
//розмірності nxnQR (double ** A, int n, double ** R, double ** Q)
{** E=(double **) malloc (sizeof (double *) * n); ** T=(double **) malloc (sizeof (double *) * n); i , j, k, g; (i=0; i lt; n; i ++)
{[i]=(double *) malloc (sizeof (double) * n); [i]=(double *) malloc (sizeof (double) * n);
} (i=0; i lt; n; i ++)
{(j=0; j lt; n; j ++)
{[i] [j]=A [i] [j]; [i] [j]=1; (i == j) [i] [j]=1; [i ] [j]=0;
}
} (k=0; k lt; (n - 1); k ++)
{(i=k + 1; i lt; n; i ++)
{(j=0; j lt; n; j ++)
{(g=0; g lt; n; g ++)
{[j] [g]=E [j] [g];
}
} (R [i] [k]!=0)
{[k] [k]=R [k] [k]/sqrtx (powx (R [k] [k], 2) + powx (A [i] [k], 2 )); [i] [i]=T [k] [k]; [k] [i]=R [i] [k]/sqrtx (powx (R [k] [k], 2) + powx ( A [i] [k], 2)); [i] [k]=T [k] [i];
} ( amp; T [0], amp; R [0], n, n, amp; R [0]); ( amp; T [0], amp; Q [0] , n, n, amp; Q [0]);
}
} (E); (T);
}
//Трансспонірованіе матриці розміру nxm
//Аргументи:
//x - покажчик на початкову матрицю
//xt - покажчик на результуючу матрицю
//n, m - розмірність матриць
void transp (double ** x, double ** xt, int n, int m)
{i, j; (i=0; i lt; n; i ++) (j=0; j lt; m; j ++) [i] [j]=x [j] [i ];
}
//Сортування СЧ і СВ
//Аргументи:
//eig - покажчик на масив СЧ
//Q - покажчик на масив СВ
//n - розмірність массівовsort (double * eig, double ** Q, int n)
{i, j; fl=true; a; (fl)
{= false; (i=0; i lt; n - 1; i ++) (eig [i] lt; eig [i + 1])
{= true;=eig [i]; [i]=eig [i + 1]; [i + 1]=a; (j=0; j lt; n - 1; j ++ )
{= Q [i] [j]; [i] [j]=Q [i + 1] [j]; [i + 1] [j]=a;
}
}
}
}
//Метод головних компонент
//Аргументи:
//vect - покажчик на одновимірний масив вихідних даних
//y - покажчик на одновимірний масив результату
//n - розмірність вхідних даних
//k - розмірність результату
void PCA (double * vect, double * y, int n, int k)
{, j, m=n/k, h;
//так як vect - вектор-рядок, а алгоритм розрахований на
//вектор=стовпець, сформуємо вектор х=transp (vect)
double ** x=(double **) malloc (sizeof (double *)); [0]=(double *) malloc (sizeof (double) * n); (i=0; i lt; n; i ++) [0] [i]=vect [i]; ** Xm=(double **) malloc (sizeof (double *) * n); ** XT=(double **) malloc ( sizeof (double *) * m); (i=0; i lt; n; i ++) [i]=(double *) malloc (sizeof (double) * m); (i=0; i lt; m; i ++ ) [i]=(double *) malloc (sizeof (double) * n); ** Rxx=(double **) malloc (sizeof (double *) * n); (i=0; i lt; n; i ++ ) [i]=(double *) malloc (sizeof (double) * n);
//сформуємо матрицю Х вихідних векторів