annotate pca.c @ 836:af688c6fa72f libavutil

Move read_line() and write_line() definition from pixdesc.h to pixdesc.c, which are now not anymore marked as static inline. Fix the inclusion of the private header intreadwrite.h in the public header pixdesc.h.
author stefano
date Tue, 16 Feb 2010 20:17:50 +0000
parents 5d344280a1f8
children 0795a743bda1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
550
200789f57b62 Principal component analysis
michael
parents:
diff changeset
1 /*
633
8c48a1b999a3 spelling/grammar/consistency review part I
diego
parents: 596
diff changeset
2 * principal component analysis (PCA)
550
200789f57b62 Principal component analysis
michael
parents:
diff changeset
3 * Copyright (c) 2004 Michael Niedermayer <michaelni@gmx.at>
200789f57b62 Principal component analysis
michael
parents:
diff changeset
4 *
563
daccf2fe1053 Copy and paste LGPL from tree.h, the previous one referred to a non-existing
michael
parents: 557
diff changeset
5 * This file is part of FFmpeg.
daccf2fe1053 Copy and paste LGPL from tree.h, the previous one referred to a non-existing
michael
parents: 557
diff changeset
6 *
daccf2fe1053 Copy and paste LGPL from tree.h, the previous one referred to a non-existing
michael
parents: 557
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
550
200789f57b62 Principal component analysis
michael
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
200789f57b62 Principal component analysis
michael
parents:
diff changeset
9 * License as published by the Free Software Foundation; either
563
daccf2fe1053 Copy and paste LGPL from tree.h, the previous one referred to a non-existing
michael
parents: 557
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
550
200789f57b62 Principal component analysis
michael
parents:
diff changeset
11 *
563
daccf2fe1053 Copy and paste LGPL from tree.h, the previous one referred to a non-existing
michael
parents: 557
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
550
200789f57b62 Principal component analysis
michael
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
200789f57b62 Principal component analysis
michael
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
200789f57b62 Principal component analysis
michael
parents:
diff changeset
15 * Lesser General Public License for more details.
200789f57b62 Principal component analysis
michael
parents:
diff changeset
16 *
200789f57b62 Principal component analysis
michael
parents:
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
563
daccf2fe1053 Copy and paste LGPL from tree.h, the previous one referred to a non-existing
michael
parents: 557
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
daccf2fe1053 Copy and paste LGPL from tree.h, the previous one referred to a non-existing
michael
parents: 557
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
550
200789f57b62 Principal component analysis
michael
parents:
diff changeset
20 */
200789f57b62 Principal component analysis
michael
parents:
diff changeset
21
200789f57b62 Principal component analysis
michael
parents:
diff changeset
22 /**
642
70bdd5501662 Use full internal pathname in doxygen @file directives.
diego
parents: 633
diff changeset
23 * @file libavutil/pca.c
633
8c48a1b999a3 spelling/grammar/consistency review part I
diego
parents: 596
diff changeset
24 * principal component analysis (PCA)
550
200789f57b62 Principal component analysis
michael
parents:
diff changeset
25 */
200789f57b62 Principal component analysis
michael
parents:
diff changeset
26
551
fe6d70cb51a6 fix includes
michael
parents: 550
diff changeset
27 #include "common.h"
550
200789f57b62 Principal component analysis
michael
parents:
diff changeset
28 #include "pca.h"
200789f57b62 Principal component analysis
michael
parents:
diff changeset
29
557
9f3f45596ecf Move context struct to c file.
michael
parents: 555
diff changeset
30 typedef struct PCA{
9f3f45596ecf Move context struct to c file.
michael
parents: 555
diff changeset
31 int count;
9f3f45596ecf Move context struct to c file.
michael
parents: 555
diff changeset
32 int n;
9f3f45596ecf Move context struct to c file.
michael
parents: 555
diff changeset
33 double *covariance;
9f3f45596ecf Move context struct to c file.
michael
parents: 555
diff changeset
34 double *mean;
9f3f45596ecf Move context struct to c file.
michael
parents: 555
diff changeset
35 }PCA;
9f3f45596ecf Move context struct to c file.
michael
parents: 555
diff changeset
36
555
2fb78abcf725 Make ff_pca_init() allocate it struct instead of letting the user provide
michael
parents: 554
diff changeset
37 PCA *ff_pca_init(int n){
2fb78abcf725 Make ff_pca_init() allocate it struct instead of letting the user provide
michael
parents: 554
diff changeset
38 PCA *pca;
550
200789f57b62 Principal component analysis
michael
parents:
diff changeset
39 if(n<=0)
555
2fb78abcf725 Make ff_pca_init() allocate it struct instead of letting the user provide
michael
parents: 554
diff changeset
40 return NULL;
550
200789f57b62 Principal component analysis
michael
parents:
diff changeset
41
555
2fb78abcf725 Make ff_pca_init() allocate it struct instead of letting the user provide
michael
parents: 554
diff changeset
42 pca= av_mallocz(sizeof(PCA));
550
200789f57b62 Principal component analysis
michael
parents:
diff changeset
43 pca->n= n;
200789f57b62 Principal component analysis
michael
parents:
diff changeset
44 pca->count=0;
200789f57b62 Principal component analysis
michael
parents:
diff changeset
45 pca->covariance= av_mallocz(sizeof(double)*n*n);
200789f57b62 Principal component analysis
michael
parents:
diff changeset
46 pca->mean= av_mallocz(sizeof(double)*n);
200789f57b62 Principal component analysis
michael
parents:
diff changeset
47
555
2fb78abcf725 Make ff_pca_init() allocate it struct instead of letting the user provide
michael
parents: 554
diff changeset
48 return pca;
550
200789f57b62 Principal component analysis
michael
parents:
diff changeset
49 }
200789f57b62 Principal component analysis
michael
parents:
diff changeset
50
200789f57b62 Principal component analysis
michael
parents:
diff changeset
51 void ff_pca_free(PCA *pca){
200789f57b62 Principal component analysis
michael
parents:
diff changeset
52 av_freep(&pca->covariance);
200789f57b62 Principal component analysis
michael
parents:
diff changeset
53 av_freep(&pca->mean);
555
2fb78abcf725 Make ff_pca_init() allocate it struct instead of letting the user provide
michael
parents: 554
diff changeset
54 av_free(pca);
550
200789f57b62 Principal component analysis
michael
parents:
diff changeset
55 }
200789f57b62 Principal component analysis
michael
parents:
diff changeset
56
200789f57b62 Principal component analysis
michael
parents:
diff changeset
57 void ff_pca_add(PCA *pca, double *v){
200789f57b62 Principal component analysis
michael
parents:
diff changeset
58 int i, j;
200789f57b62 Principal component analysis
michael
parents:
diff changeset
59 const int n= pca->n;
200789f57b62 Principal component analysis
michael
parents:
diff changeset
60
200789f57b62 Principal component analysis
michael
parents:
diff changeset
61 for(i=0; i<n; i++){
200789f57b62 Principal component analysis
michael
parents:
diff changeset
62 pca->mean[i] += v[i];
200789f57b62 Principal component analysis
michael
parents:
diff changeset
63 for(j=i; j<n; j++)
200789f57b62 Principal component analysis
michael
parents:
diff changeset
64 pca->covariance[j + i*n] += v[i]*v[j];
200789f57b62 Principal component analysis
michael
parents:
diff changeset
65 }
200789f57b62 Principal component analysis
michael
parents:
diff changeset
66 pca->count++;
200789f57b62 Principal component analysis
michael
parents:
diff changeset
67 }
200789f57b62 Principal component analysis
michael
parents:
diff changeset
68
200789f57b62 Principal component analysis
michael
parents:
diff changeset
69 int ff_pca(PCA *pca, double *eigenvector, double *eigenvalue){
585
0c8ca6fd0832 Initialize variable to silence the warning:
diego
parents: 563
diff changeset
70 int i, j, pass;
0c8ca6fd0832 Initialize variable to silence the warning:
diego
parents: 563
diff changeset
71 int k=0;
550
200789f57b62 Principal component analysis
michael
parents:
diff changeset
72 const int n= pca->n;
200789f57b62 Principal component analysis
michael
parents:
diff changeset
73 double z[n];
200789f57b62 Principal component analysis
michael
parents:
diff changeset
74
200789f57b62 Principal component analysis
michael
parents:
diff changeset
75 memset(eigenvector, 0, sizeof(double)*n*n);
200789f57b62 Principal component analysis
michael
parents:
diff changeset
76
200789f57b62 Principal component analysis
michael
parents:
diff changeset
77 for(j=0; j<n; j++){
200789f57b62 Principal component analysis
michael
parents:
diff changeset
78 pca->mean[j] /= pca->count;
200789f57b62 Principal component analysis
michael
parents:
diff changeset
79 eigenvector[j + j*n] = 1.0;
200789f57b62 Principal component analysis
michael
parents:
diff changeset
80 for(i=0; i<=j; i++){
200789f57b62 Principal component analysis
michael
parents:
diff changeset
81 pca->covariance[j + i*n] /= pca->count;
200789f57b62 Principal component analysis
michael
parents:
diff changeset
82 pca->covariance[j + i*n] -= pca->mean[i] * pca->mean[j];
200789f57b62 Principal component analysis
michael
parents:
diff changeset
83 pca->covariance[i + j*n] = pca->covariance[j + i*n];
200789f57b62 Principal component analysis
michael
parents:
diff changeset
84 }
200789f57b62 Principal component analysis
michael
parents:
diff changeset
85 eigenvalue[j]= pca->covariance[j + j*n];
200789f57b62 Principal component analysis
michael
parents:
diff changeset
86 z[j]= 0;
200789f57b62 Principal component analysis
michael
parents:
diff changeset
87 }
200789f57b62 Principal component analysis
michael
parents:
diff changeset
88
200789f57b62 Principal component analysis
michael
parents:
diff changeset
89 for(pass=0; pass < 50; pass++){
200789f57b62 Principal component analysis
michael
parents:
diff changeset
90 double sum=0;
200789f57b62 Principal component analysis
michael
parents:
diff changeset
91
200789f57b62 Principal component analysis
michael
parents:
diff changeset
92 for(i=0; i<n; i++)
200789f57b62 Principal component analysis
michael
parents:
diff changeset
93 for(j=i+1; j<n; j++)
200789f57b62 Principal component analysis
michael
parents:
diff changeset
94 sum += fabs(pca->covariance[j + i*n]);
200789f57b62 Principal component analysis
michael
parents:
diff changeset
95
200789f57b62 Principal component analysis
michael
parents:
diff changeset
96 if(sum == 0){
200789f57b62 Principal component analysis
michael
parents:
diff changeset
97 for(i=0; i<n; i++){
200789f57b62 Principal component analysis
michael
parents:
diff changeset
98 double maxvalue= -1;
200789f57b62 Principal component analysis
michael
parents:
diff changeset
99 for(j=i; j<n; j++){
200789f57b62 Principal component analysis
michael
parents:
diff changeset
100 if(eigenvalue[j] > maxvalue){
200789f57b62 Principal component analysis
michael
parents:
diff changeset
101 maxvalue= eigenvalue[j];
200789f57b62 Principal component analysis
michael
parents:
diff changeset
102 k= j;
200789f57b62 Principal component analysis
michael
parents:
diff changeset
103 }
200789f57b62 Principal component analysis
michael
parents:
diff changeset
104 }
200789f57b62 Principal component analysis
michael
parents:
diff changeset
105 eigenvalue[k]= eigenvalue[i];
200789f57b62 Principal component analysis
michael
parents:
diff changeset
106 eigenvalue[i]= maxvalue;
200789f57b62 Principal component analysis
michael
parents:
diff changeset
107 for(j=0; j<n; j++){
200789f57b62 Principal component analysis
michael
parents:
diff changeset
108 double tmp= eigenvector[k + j*n];
200789f57b62 Principal component analysis
michael
parents:
diff changeset
109 eigenvector[k + j*n]= eigenvector[i + j*n];
200789f57b62 Principal component analysis
michael
parents:
diff changeset
110 eigenvector[i + j*n]= tmp;
200789f57b62 Principal component analysis
michael
parents:
diff changeset
111 }
200789f57b62 Principal component analysis
michael
parents:
diff changeset
112 }
200789f57b62 Principal component analysis
michael
parents:
diff changeset
113 return pass;
200789f57b62 Principal component analysis
michael
parents:
diff changeset
114 }
200789f57b62 Principal component analysis
michael
parents:
diff changeset
115
200789f57b62 Principal component analysis
michael
parents:
diff changeset
116 for(i=0; i<n; i++){
200789f57b62 Principal component analysis
michael
parents:
diff changeset
117 for(j=i+1; j<n; j++){
200789f57b62 Principal component analysis
michael
parents:
diff changeset
118 double covar= pca->covariance[j + i*n];
200789f57b62 Principal component analysis
michael
parents:
diff changeset
119 double t,c,s,tau,theta, h;
200789f57b62 Principal component analysis
michael
parents:
diff changeset
120
200789f57b62 Principal component analysis
michael
parents:
diff changeset
121 if(pass < 3 && fabs(covar) < sum / (5*n*n)) //FIXME why pass < 3
200789f57b62 Principal component analysis
michael
parents:
diff changeset
122 continue;
633
8c48a1b999a3 spelling/grammar/consistency review part I
diego
parents: 596
diff changeset
123 if(fabs(covar) == 0.0) //FIXME should not be needed
550
200789f57b62 Principal component analysis
michael
parents:
diff changeset
124 continue;
200789f57b62 Principal component analysis
michael
parents:
diff changeset
125 if(pass >=3 && fabs((eigenvalue[j]+z[j])/covar) > (1LL<<32) && fabs((eigenvalue[i]+z[i])/covar) > (1LL<<32)){
200789f57b62 Principal component analysis
michael
parents:
diff changeset
126 pca->covariance[j + i*n]=0.0;
200789f57b62 Principal component analysis
michael
parents:
diff changeset
127 continue;
200789f57b62 Principal component analysis
michael
parents:
diff changeset
128 }
200789f57b62 Principal component analysis
michael
parents:
diff changeset
129
200789f57b62 Principal component analysis
michael
parents:
diff changeset
130 h= (eigenvalue[j]+z[j]) - (eigenvalue[i]+z[i]);
200789f57b62 Principal component analysis
michael
parents:
diff changeset
131 theta=0.5*h/covar;
200789f57b62 Principal component analysis
michael
parents:
diff changeset
132 t=1.0/(fabs(theta)+sqrt(1.0+theta*theta));
200789f57b62 Principal component analysis
michael
parents:
diff changeset
133 if(theta < 0.0) t = -t;
200789f57b62 Principal component analysis
michael
parents:
diff changeset
134
200789f57b62 Principal component analysis
michael
parents:
diff changeset
135 c=1.0/sqrt(1+t*t);
200789f57b62 Principal component analysis
michael
parents:
diff changeset
136 s=t*c;
200789f57b62 Principal component analysis
michael
parents:
diff changeset
137 tau=s/(1.0+c);
200789f57b62 Principal component analysis
michael
parents:
diff changeset
138 z[i] -= t*covar;
200789f57b62 Principal component analysis
michael
parents:
diff changeset
139 z[j] += t*covar;
200789f57b62 Principal component analysis
michael
parents:
diff changeset
140
554
29d015080b3d Do not mix declarations and statements (by ramiro).
michael
parents: 553
diff changeset
141 #define ROTATE(a,i,j,k,l) {\
550
200789f57b62 Principal component analysis
michael
parents:
diff changeset
142 double g=a[j + i*n];\
200789f57b62 Principal component analysis
michael
parents:
diff changeset
143 double h=a[l + k*n];\
200789f57b62 Principal component analysis
michael
parents:
diff changeset
144 a[j + i*n]=g-s*(h+g*tau);\
554
29d015080b3d Do not mix declarations and statements (by ramiro).
michael
parents: 553
diff changeset
145 a[l + k*n]=h+s*(g-h*tau); }
550
200789f57b62 Principal component analysis
michael
parents:
diff changeset
146 for(k=0; k<n; k++) {
200789f57b62 Principal component analysis
michael
parents:
diff changeset
147 if(k!=i && k!=j){
200789f57b62 Principal component analysis
michael
parents:
diff changeset
148 ROTATE(pca->covariance,FFMIN(k,i),FFMAX(k,i),FFMIN(k,j),FFMAX(k,j))
200789f57b62 Principal component analysis
michael
parents:
diff changeset
149 }
200789f57b62 Principal component analysis
michael
parents:
diff changeset
150 ROTATE(eigenvector,k,i,k,j)
200789f57b62 Principal component analysis
michael
parents:
diff changeset
151 }
200789f57b62 Principal component analysis
michael
parents:
diff changeset
152 pca->covariance[j + i*n]=0.0;
200789f57b62 Principal component analysis
michael
parents:
diff changeset
153 }
200789f57b62 Principal component analysis
michael
parents:
diff changeset
154 }
200789f57b62 Principal component analysis
michael
parents:
diff changeset
155 for (i=0; i<n; i++) {
200789f57b62 Principal component analysis
michael
parents:
diff changeset
156 eigenvalue[i] += z[i];
200789f57b62 Principal component analysis
michael
parents:
diff changeset
157 z[i]=0.0;
200789f57b62 Principal component analysis
michael
parents:
diff changeset
158 }
200789f57b62 Principal component analysis
michael
parents:
diff changeset
159 }
200789f57b62 Principal component analysis
michael
parents:
diff changeset
160
200789f57b62 Principal component analysis
michael
parents:
diff changeset
161 return -1;
200789f57b62 Principal component analysis
michael
parents:
diff changeset
162 }
200789f57b62 Principal component analysis
michael
parents:
diff changeset
163
553
288f054e06e8 put testing code under #ifdef TEST
michael
parents: 552
diff changeset
164 #ifdef TEST
550
200789f57b62 Principal component analysis
michael
parents:
diff changeset
165
200789f57b62 Principal component analysis
michael
parents:
diff changeset
166 #undef printf
200789f57b62 Principal component analysis
michael
parents:
diff changeset
167 #include <stdio.h>
200789f57b62 Principal component analysis
michael
parents:
diff changeset
168 #include <stdlib.h>
701
ae6e96434bec Replace random() usage in test programs by av_lfg_*().
diego
parents: 642
diff changeset
169 #include "lfg.h"
550
200789f57b62 Principal component analysis
michael
parents:
diff changeset
170
596
11efcc64c2f6 Add missing 'void' keyword to parameterless function declarations.
diego
parents: 585
diff changeset
171 int main(void){
555
2fb78abcf725 Make ff_pca_init() allocate it struct instead of letting the user provide
michael
parents: 554
diff changeset
172 PCA *pca;
550
200789f57b62 Principal component analysis
michael
parents:
diff changeset
173 int i, j, k;
200789f57b62 Principal component analysis
michael
parents:
diff changeset
174 #define LEN 8
200789f57b62 Principal component analysis
michael
parents:
diff changeset
175 double eigenvector[LEN*LEN];
200789f57b62 Principal component analysis
michael
parents:
diff changeset
176 double eigenvalue[LEN];
726
5d344280a1f8 cosmetics: Rename prn variable to prng (Pseudo Random Number Generator).
diego
parents: 701
diff changeset
177 AVLFG prng;
701
ae6e96434bec Replace random() usage in test programs by av_lfg_*().
diego
parents: 642
diff changeset
178
726
5d344280a1f8 cosmetics: Rename prn variable to prng (Pseudo Random Number Generator).
diego
parents: 701
diff changeset
179 av_lfg_init(&prng, 1);
550
200789f57b62 Principal component analysis
michael
parents:
diff changeset
180
555
2fb78abcf725 Make ff_pca_init() allocate it struct instead of letting the user provide
michael
parents: 554
diff changeset
181 pca= ff_pca_init(LEN);
550
200789f57b62 Principal component analysis
michael
parents:
diff changeset
182
200789f57b62 Principal component analysis
michael
parents:
diff changeset
183 for(i=0; i<9000000; i++){
200789f57b62 Principal component analysis
michael
parents:
diff changeset
184 double v[2*LEN+100];
200789f57b62 Principal component analysis
michael
parents:
diff changeset
185 double sum=0;
726
5d344280a1f8 cosmetics: Rename prn variable to prng (Pseudo Random Number Generator).
diego
parents: 701
diff changeset
186 int pos = av_lfg_get(&prng) % LEN;
5d344280a1f8 cosmetics: Rename prn variable to prng (Pseudo Random Number Generator).
diego
parents: 701
diff changeset
187 int v2 = av_lfg_get(&prng) % 101 - 50;
5d344280a1f8 cosmetics: Rename prn variable to prng (Pseudo Random Number Generator).
diego
parents: 701
diff changeset
188 v[0] = av_lfg_get(&prng) % 101 - 50;
550
200789f57b62 Principal component analysis
michael
parents:
diff changeset
189 for(j=1; j<8; j++){
200789f57b62 Principal component analysis
michael
parents:
diff changeset
190 if(j<=pos) v[j]= v[0];
200789f57b62 Principal component analysis
michael
parents:
diff changeset
191 else v[j]= v2;
200789f57b62 Principal component analysis
michael
parents:
diff changeset
192 sum += v[j];
200789f57b62 Principal component analysis
michael
parents:
diff changeset
193 }
200789f57b62 Principal component analysis
michael
parents:
diff changeset
194 /* for(j=0; j<LEN; j++){
200789f57b62 Principal component analysis
michael
parents:
diff changeset
195 v[j] -= v[pos];
200789f57b62 Principal component analysis
michael
parents:
diff changeset
196 }*/
726
5d344280a1f8 cosmetics: Rename prn variable to prng (Pseudo Random Number Generator).
diego
parents: 701
diff changeset
197 // sum += av_lfg_get(&prng) % 10;
550
200789f57b62 Principal component analysis
michael
parents:
diff changeset
198 /* for(j=0; j<LEN; j++){
200789f57b62 Principal component analysis
michael
parents:
diff changeset
199 v[j] -= sum/LEN;
200789f57b62 Principal component analysis
michael
parents:
diff changeset
200 }*/
200789f57b62 Principal component analysis
michael
parents:
diff changeset
201 // lbt1(v+100,v+100,LEN);
555
2fb78abcf725 Make ff_pca_init() allocate it struct instead of letting the user provide
michael
parents: 554
diff changeset
202 ff_pca_add(pca, v);
550
200789f57b62 Principal component analysis
michael
parents:
diff changeset
203 }
200789f57b62 Principal component analysis
michael
parents:
diff changeset
204
200789f57b62 Principal component analysis
michael
parents:
diff changeset
205
555
2fb78abcf725 Make ff_pca_init() allocate it struct instead of letting the user provide
michael
parents: 554
diff changeset
206 ff_pca(pca, eigenvector, eigenvalue);
550
200789f57b62 Principal component analysis
michael
parents:
diff changeset
207 for(i=0; i<LEN; i++){
555
2fb78abcf725 Make ff_pca_init() allocate it struct instead of letting the user provide
michael
parents: 554
diff changeset
208 pca->count= 1;
2fb78abcf725 Make ff_pca_init() allocate it struct instead of letting the user provide
michael
parents: 554
diff changeset
209 pca->mean[i]= 0;
550
200789f57b62 Principal component analysis
michael
parents:
diff changeset
210
200789f57b62 Principal component analysis
michael
parents:
diff changeset
211 // (0.5^|x|)^2 = 0.5^2|x| = 0.25^|x|
200789f57b62 Principal component analysis
michael
parents:
diff changeset
212
200789f57b62 Principal component analysis
michael
parents:
diff changeset
213
200789f57b62 Principal component analysis
michael
parents:
diff changeset
214 // pca.covariance[i + i*LEN]= pow(0.5, fabs
200789f57b62 Principal component analysis
michael
parents:
diff changeset
215 for(j=i; j<LEN; j++){
555
2fb78abcf725 Make ff_pca_init() allocate it struct instead of letting the user provide
michael
parents: 554
diff changeset
216 printf("%f ", pca->covariance[i + j*LEN]);
550
200789f57b62 Principal component analysis
michael
parents:
diff changeset
217 }
200789f57b62 Principal component analysis
michael
parents:
diff changeset
218 printf("\n");
200789f57b62 Principal component analysis
michael
parents:
diff changeset
219 }
200789f57b62 Principal component analysis
michael
parents:
diff changeset
220
200789f57b62 Principal component analysis
michael
parents:
diff changeset
221 #if 1
200789f57b62 Principal component analysis
michael
parents:
diff changeset
222 for(i=0; i<LEN; i++){
200789f57b62 Principal component analysis
michael
parents:
diff changeset
223 double v[LEN];
200789f57b62 Principal component analysis
michael
parents:
diff changeset
224 double error=0;
200789f57b62 Principal component analysis
michael
parents:
diff changeset
225 memset(v, 0, sizeof(v));
200789f57b62 Principal component analysis
michael
parents:
diff changeset
226 for(j=0; j<LEN; j++){
200789f57b62 Principal component analysis
michael
parents:
diff changeset
227 for(k=0; k<LEN; k++){
555
2fb78abcf725 Make ff_pca_init() allocate it struct instead of letting the user provide
michael
parents: 554
diff changeset
228 v[j] += pca->covariance[FFMIN(k,j) + FFMAX(k,j)*LEN] * eigenvector[i + k*LEN];
550
200789f57b62 Principal component analysis
michael
parents:
diff changeset
229 }
200789f57b62 Principal component analysis
michael
parents:
diff changeset
230 v[j] /= eigenvalue[i];
200789f57b62 Principal component analysis
michael
parents:
diff changeset
231 error += fabs(v[j] - eigenvector[i + j*LEN]);
200789f57b62 Principal component analysis
michael
parents:
diff changeset
232 }
200789f57b62 Principal component analysis
michael
parents:
diff changeset
233 printf("%f ", error);
200789f57b62 Principal component analysis
michael
parents:
diff changeset
234 }
200789f57b62 Principal component analysis
michael
parents:
diff changeset
235 printf("\n");
200789f57b62 Principal component analysis
michael
parents:
diff changeset
236 #endif
200789f57b62 Principal component analysis
michael
parents:
diff changeset
237 for(i=0; i<LEN; i++){
200789f57b62 Principal component analysis
michael
parents:
diff changeset
238 for(j=0; j<LEN; j++){
200789f57b62 Principal component analysis
michael
parents:
diff changeset
239 printf("%9.6f ", eigenvector[i + j*LEN]);
200789f57b62 Principal component analysis
michael
parents:
diff changeset
240 }
200789f57b62 Principal component analysis
michael
parents:
diff changeset
241 printf(" %9.1f %f\n", eigenvalue[i], eigenvalue[i]/eigenvalue[0]);
200789f57b62 Principal component analysis
michael
parents:
diff changeset
242 }
200789f57b62 Principal component analysis
michael
parents:
diff changeset
243
200789f57b62 Principal component analysis
michael
parents:
diff changeset
244 return 0;
200789f57b62 Principal component analysis
michael
parents:
diff changeset
245 }
200789f57b62 Principal component analysis
michael
parents:
diff changeset
246 #endif