//вектор=стовпець, сформуємо вектор х=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);
//сформуємо матрицю Х вихідних векторів
//розмірність матриці визначимо як 1000хn/1000
h=0; (i=0; i lt; m; i ++) (j=0; j lt; n; j ++)
{[j] [i]=x [0] [h]; ++;
} ( amp; Xm [0], amp; XT [0], n, m); ( amp; Xm [0], amp; XT [0], n, m, amp; Rxx [0]); (i=0; i lt; n; i ++) (j=0; j lt; n; j ++) [i] [j]=Rxx [i] [j]/m; ** R =(double **) malloc (sizeof (double *) * n); ** Q=(double **) malloc (sizeof (double *) * n); (i=0; i lt; n; i ++)
{[i]=(double *) malloc (sizeof (double) * n); [i]=(double *) malloc (sizeof (double) * n);
} ( amp; Rxx [0], n, amp; R [0], amp; Q [0]); * eig=(double *) malloc (sizeof (double) * n) ; (i=0; i lt; n; i ++) [i]=R [i] [i]; ( amp; eig [0], amp; Q [0], n); ** W=(double * *) malloc (sizeof (double *) * k); (i=0; i lt; k; i ++) [i]=(double *) malloc (sizeof (double) * n); (i=0; i lt ; k; i ++) (j=0; j lt; n; j ++) [i] [j]=Q [j] [i]; (i=0; i lt; k; i ++) (j=0; j lt; n; j ++) [i]=W [i] [j] * x [0] [j]; (x); (Xm); (XT);
free (Rxx); (W);
}
Для реалізації методу головних компонент були так само реалізовані множення і транспонування матриць, QR метод пошуку власних чисел і векторів, для якого було потрібно обчислення квадратного кореня і сортування власних чисел і сполучених з ними власних векторів.
Розглянемо реалізацію тільки QR-алгоритму та алгоритму сортування, так як всі інші алгоритми прості і не вимагають детального розгляду.
QR - алгоритм
В якості аргументів метод приймає покажчик на матрицю, для якої будуть вестися обчислення, покажчики на результуючі матриці RіQ, а так само розмірність всіх матриць. Так як алгоритм реалізований для квадратних матріцnxn, то розмірність матриць можна передати одним цілочисловим параметром.
//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);
}
Сортування
Модуль сортування здійснює перестановку масиву власних чисел матірци в порядку убування і, відповідно до нього, перестановку сполучених з власними числами власних векторів матриці. Тобто при зміні місцями iіjсобственних чисел, відповідно міняються місцями так само і iіjсобственние вектора.
Модуль приймає в якості аргументів покажчики на масив власних чисел, матрицю власних векторів і розмірність масиву. Так як обчислення власних значень велися для квадратної матриці nxn, то в загальному випадку у неї nсобственн...