This is generic C implementation of mv_complex It may work with unaligned data. ********************************************************************/
| 286 | It may work with unaligned data. |
| 287 | ********************************************************************/ |
| 288 | void ialglib::mv_complex_generic(int m, int n, const double *a, const double *x, ap::complex *cy, double *dy, int stride, ap::complex alpha, ap::complex beta) |
| 289 | { |
| 290 | int i, j; |
| 291 | const double *pa, *parow, *pb; |
| 292 | |
| 293 | parow = a; |
| 294 | for(i=0; i<m; i++) |
| 295 | { |
| 296 | double v0 = 0, v1 = 0; |
| 297 | pa = parow; |
| 298 | pb = x; |
| 299 | for(j=0; j<n; j++) |
| 300 | { |
| 301 | v0 += pa[0]*pb[0]; |
| 302 | v1 += pa[0]*pb[1]; |
| 303 | v0 -= pa[1]*pb[1]; |
| 304 | v1 += pa[1]*pb[0]; |
| 305 | |
| 306 | pa += 2; |
| 307 | pb += 2; |
| 308 | } |
| 309 | if( cy!=NULL ) |
| 310 | { |
| 311 | double tx = (beta.x*cy->x-beta.y*cy->y)+(alpha.x*v0-alpha.y*v1); |
| 312 | double ty = (beta.x*cy->y+beta.y*cy->x)+(alpha.x*v1+alpha.y*v0); |
| 313 | cy->x = tx; |
| 314 | cy->y = ty; |
| 315 | cy+=stride; |
| 316 | } |
| 317 | else |
| 318 | { |
| 319 | double tx = (beta.x*dy[0]-beta.y*dy[1])+(alpha.x*v0-alpha.y*v1); |
| 320 | double ty = (beta.x*dy[1]+beta.y*dy[0])+(alpha.x*v1+alpha.y*v0); |
| 321 | dy[0] = tx; |
| 322 | dy[1] = ty; |
| 323 | dy += 2*stride; |
| 324 | } |
| 325 | parow += 2*alglib_c_block; |
| 326 | } |
| 327 | } |
| 328 | |
| 329 | |
| 330 | /******************************************************************** |
nothing calls this directly
no outgoing calls
no test coverage detected