Mercurial > hg > octave-nkf
comparison liboctave/CColVector.cc @ 1205:8302fab9fe24
[project @ 1995-04-04 02:05:01 by jwe]
author | jwe |
---|---|
date | Tue, 04 Apr 1995 02:05:01 +0000 |
parents | b6360f2d4fa6 |
children | 0bf4d2b7def4 |
comparison
equal
deleted
inserted
replaced
1204:68d147abe7ca | 1205:8302fab9fe24 |
---|---|
36 | 36 |
37 // Fortran functions we call. | 37 // Fortran functions we call. |
38 | 38 |
39 extern "C" | 39 extern "C" |
40 { | 40 { |
41 int F77_FCN (zgemm) (const char*, const char*, const int*, | 41 int F77_FCN (zgemv) (const char*, const int*, const int*, |
42 const int*, const int*, const Complex*, | 42 const Complex*, const Complex*, const int*, |
43 const Complex*, const int*, const Complex*, | 43 const Complex*, const int*, const Complex*, |
44 const int*, const Complex*, Complex*, const int*, | 44 Complex*, const int*, long); |
45 long, long); | |
46 } | 45 } |
47 | 46 |
48 /* | 47 /* |
49 * Complex Column Vector class | 48 * Complex Column Vector class |
50 */ | 49 */ |
62 { | 61 { |
63 for (int i = 0; i < length (); i++) | 62 for (int i = 0; i < length (); i++) |
64 elem (i) = a.elem (i); | 63 elem (i) = a.elem (i); |
65 } | 64 } |
66 | 65 |
67 #if 0 | |
68 ComplexColumnVector& | |
69 ComplexColumnVector::resize (int n) | |
70 { | |
71 if (n < 0) | |
72 { | |
73 (*current_liboctave_error_handler) | |
74 ("can't resize to negative dimension"); | |
75 return *this; | |
76 } | |
77 | |
78 Complex *new_data = 0; | |
79 if (n > 0) | |
80 { | |
81 new_data = new Complex [n]; | |
82 int min_len = len < n ? len : n; | |
83 | |
84 for (int i = 0; i < min_len; i++) | |
85 new_data[i] = data[i]; | |
86 } | |
87 | |
88 delete [] data; | |
89 len = n; | |
90 data = new_data; | |
91 | |
92 return *this; | |
93 } | |
94 | |
95 ComplexColumnVector& | |
96 ComplexColumnVector::resize (int n, double val) | |
97 { | |
98 int old_len = len; | |
99 resize (n); | |
100 for (int i = old_len; i < len; i++) | |
101 data[i] = val; | |
102 | |
103 return *this; | |
104 } | |
105 | |
106 ComplexColumnVector& | |
107 ComplexColumnVector::resize (int n, const Complex& val) | |
108 { | |
109 int old_len = len; | |
110 resize (n); | |
111 for (int i = old_len; i < len; i++) | |
112 data[i] = val; | |
113 | |
114 return *this; | |
115 } | |
116 #endif | |
117 | |
118 int | 66 int |
119 ComplexColumnVector::operator == (const ComplexColumnVector& a) const | 67 ComplexColumnVector::operator == (const ComplexColumnVector& a) const |
120 { | 68 { |
121 int len = length (); | 69 int len = length (); |
122 if (len != a.length ()) | 70 if (len != a.length ()) |
254 { | 202 { |
255 int len = length (); | 203 int len = length (); |
256 return ComplexRowVector (dup (data (), len), len); | 204 return ComplexRowVector (dup (data (), len), len); |
257 } | 205 } |
258 | 206 |
259 ColumnVector | |
260 real (const ComplexColumnVector& a) | |
261 { | |
262 int a_len = a.length (); | |
263 ColumnVector retval; | |
264 if (a_len > 0) | |
265 retval = ColumnVector (real_dup (a.data (), a_len), a_len); | |
266 return retval; | |
267 } | |
268 | |
269 ColumnVector | |
270 imag (const ComplexColumnVector& a) | |
271 { | |
272 int a_len = a.length (); | |
273 ColumnVector retval; | |
274 if (a_len > 0) | |
275 retval = ColumnVector (imag_dup (a.data (), a_len), a_len); | |
276 return retval; | |
277 } | |
278 | |
279 ComplexColumnVector | 207 ComplexColumnVector |
280 conj (const ComplexColumnVector& a) | 208 conj (const ComplexColumnVector& a) |
281 { | 209 { |
282 int a_len = a.length (); | 210 int a_len = a.length (); |
283 ComplexColumnVector retval; | 211 ComplexColumnVector retval; |
414 { | 342 { |
415 int len = v.length (); | 343 int len = v.length (); |
416 return ComplexColumnVector (divide (v.data (), len, s), len); | 344 return ComplexColumnVector (divide (v.data (), len, s), len); |
417 } | 345 } |
418 | 346 |
347 ComplexColumnVector | |
348 operator + (const ColumnVector& a, const Complex& s) | |
349 { | |
350 int len = a.length (); | |
351 return ComplexColumnVector (add (a.data (), len, s), len); | |
352 } | |
353 | |
354 ComplexColumnVector | |
355 operator - (const ColumnVector& a, const Complex& s) | |
356 { | |
357 int len = a.length (); | |
358 return ComplexColumnVector (subtract (a.data (), len, s), len); | |
359 } | |
360 | |
361 ComplexColumnVector | |
362 operator * (const ColumnVector& a, const Complex& s) | |
363 { | |
364 int len = a.length (); | |
365 return ComplexColumnVector (multiply (a.data (), len, s), len); | |
366 } | |
367 | |
368 ComplexColumnVector | |
369 operator / (const ColumnVector& a, const Complex& s) | |
370 { | |
371 int len = a.length (); | |
372 return ComplexColumnVector (divide (a.data (), len, s), len); | |
373 } | |
374 | |
419 // scalar by column vector -> column vector operations | 375 // scalar by column vector -> column vector operations |
420 | 376 |
421 ComplexColumnVector | 377 ComplexColumnVector |
422 operator + (double s, const ComplexColumnVector& a) | 378 operator + (double s, const ComplexColumnVector& a) |
423 { | 379 { |
444 { | 400 { |
445 int a_len = a.length (); | 401 int a_len = a.length (); |
446 return ComplexColumnVector (divide (s, a.data (), a_len), a_len); | 402 return ComplexColumnVector (divide (s, a.data (), a_len), a_len); |
447 } | 403 } |
448 | 404 |
449 // column vector by row vector -> matrix operations | 405 ComplexColumnVector |
450 | 406 operator + (const Complex& s, const ColumnVector& a) |
451 ComplexMatrix | 407 { |
452 operator * (const ComplexColumnVector& v, const ComplexRowVector& a) | 408 int a_len = a.length (); |
453 { | 409 return ComplexColumnVector (add (a.data (), a_len, s), a_len); |
454 int len = v.length (); | 410 } |
455 int a_len = a.length (); | 411 |
456 if (len != a_len) | 412 ComplexColumnVector |
457 { | 413 operator - (const Complex& s, const ColumnVector& a) |
458 (*current_liboctave_error_handler) | 414 { |
459 ("nonconformant vector multiplication attempted"); | 415 int a_len = a.length (); |
460 return ComplexMatrix (); | 416 return ComplexColumnVector (subtract (s, a.data (), a_len), a_len); |
461 } | 417 } |
462 | 418 |
463 if (len == 0) | 419 ComplexColumnVector |
464 return ComplexMatrix (len, len, 0.0); | 420 operator * (const Complex& s, const ColumnVector& a) |
465 | 421 { |
466 char transa = 'N'; | 422 int a_len = a.length (); |
467 char transb = 'N'; | 423 return ComplexColumnVector (multiply (a.data (), a_len, s), a_len); |
424 } | |
425 | |
426 ComplexColumnVector | |
427 operator / (const Complex& s, const ColumnVector& a) | |
428 { | |
429 int a_len = a.length (); | |
430 return ComplexColumnVector (divide (s, a.data (), a_len), a_len); | |
431 } | |
432 | |
433 // matrix by column vector -> column vector operations | |
434 | |
435 ComplexColumnVector | |
436 operator * (const ComplexMatrix& m, const ColumnVector& a) | |
437 { | |
438 ComplexColumnVector tmp (a); | |
439 return m * tmp; | |
440 } | |
441 | |
442 ComplexColumnVector | |
443 operator * (const ComplexMatrix& m, const ComplexColumnVector& a) | |
444 { | |
445 int nr = m.rows (); | |
446 int nc = m.cols (); | |
447 if (nc != a.length ()) | |
448 { | |
449 (*current_liboctave_error_handler) | |
450 ("nonconformant matrix multiplication attempted"); | |
451 return ComplexColumnVector (); | |
452 } | |
453 | |
454 if (nc == 0 || nr == 0) | |
455 return ComplexColumnVector (0); | |
456 | |
457 char trans = 'N'; | |
458 int ld = nr; | |
468 Complex alpha (1.0); | 459 Complex alpha (1.0); |
469 Complex beta (0.0); | 460 Complex beta (0.0); |
470 int anr = 1; | 461 int i_one = 1; |
471 | 462 |
472 Complex *c = new Complex [len * a_len]; | 463 Complex *y = new Complex [nr]; |
473 | 464 |
474 F77_FCN (zgemm) (&transa, &transb, &len, &a_len, &anr, &alpha, | 465 F77_FCN (zgemv) (&trans, &nr, &nc, &alpha, m.data (), &ld, a.data (), |
475 v.data (), &len, a.data (), &anr, &beta, c, &len, | 466 &i_one, &beta, y, &i_one, 1L); |
476 1L, 1L); | 467 |
477 | 468 return ComplexColumnVector (y, nr); |
478 return ComplexMatrix (c, len, a_len); | |
479 } | 469 } |
480 | 470 |
481 // column vector by column vector -> column vector operations | 471 // column vector by column vector -> column vector operations |
482 | 472 |
483 ComplexColumnVector | 473 ComplexColumnVector |
513 | 503 |
514 return ComplexColumnVector (subtract (v.data (), a.data (), len), len); | 504 return ComplexColumnVector (subtract (v.data (), a.data (), len), len); |
515 } | 505 } |
516 | 506 |
517 ComplexColumnVector | 507 ComplexColumnVector |
508 operator + (const ColumnVector& v, const ComplexColumnVector& a) | |
509 { | |
510 int len = v.length (); | |
511 if (len != a.length ()) | |
512 { | |
513 (*current_liboctave_error_handler) | |
514 ("nonconformant vector subtraction attempted"); | |
515 return ComplexColumnVector (); | |
516 } | |
517 | |
518 if (len == 0) | |
519 return ComplexColumnVector (0); | |
520 | |
521 return ComplexColumnVector (add (v.data (), a.data (), len), len); | |
522 } | |
523 | |
524 ComplexColumnVector | |
525 operator - (const ColumnVector& v, const ComplexColumnVector& a) | |
526 { | |
527 int len = v.length (); | |
528 if (len != a.length ()) | |
529 { | |
530 (*current_liboctave_error_handler) | |
531 ("nonconformant vector subtraction attempted"); | |
532 return ComplexColumnVector (); | |
533 } | |
534 | |
535 if (len == 0) | |
536 return ComplexColumnVector (0); | |
537 | |
538 return ComplexColumnVector (subtract (v.data (), a.data (), len), len); | |
539 } | |
540 | |
541 ComplexColumnVector | |
518 product (const ComplexColumnVector& v, const ColumnVector& a) | 542 product (const ComplexColumnVector& v, const ColumnVector& a) |
519 { | 543 { |
520 int len = v.length (); | 544 int len = v.length (); |
521 if (len != a.length ()) | 545 if (len != a.length ()) |
522 { | 546 { |
544 | 568 |
545 if (len == 0) | 569 if (len == 0) |
546 return ComplexColumnVector (0); | 570 return ComplexColumnVector (0); |
547 | 571 |
548 return ComplexColumnVector (divide (v.data (), a.data (), len), len); | 572 return ComplexColumnVector (divide (v.data (), a.data (), len), len); |
573 } | |
574 | |
575 ComplexColumnVector | |
576 product (const ColumnVector& v, const ComplexColumnVector& a) | |
577 { | |
578 int len = v.length (); | |
579 if (len != a.length ()) | |
580 { | |
581 (*current_liboctave_error_handler) | |
582 ("nonconformant vector product attempted"); | |
583 return ColumnVector (); | |
584 } | |
585 | |
586 if (len == 0) | |
587 return ComplexColumnVector (0); | |
588 | |
589 return ComplexColumnVector (multiply (v.data (), a.data (), len), len); | |
590 } | |
591 | |
592 ComplexColumnVector | |
593 quotient (const ColumnVector& v, const ComplexColumnVector& a) | |
594 { | |
595 int len = v.length (); | |
596 if (len != a.length ()) | |
597 { | |
598 (*current_liboctave_error_handler) | |
599 ("nonconformant vector quotient attempted"); | |
600 return ColumnVector (); | |
601 } | |
602 | |
603 if (len == 0) | |
604 return ComplexColumnVector (0); | |
605 | |
606 return ComplexColumnVector (divide (v.data (), a.data (), len), len); | |
607 } | |
608 | |
609 // matrix by column vector -> column vector operations | |
610 | |
611 ComplexColumnVector | |
612 operator * (const Matrix& m, const ComplexColumnVector& a) | |
613 { | |
614 ComplexMatrix tmp (m); | |
615 return tmp * a; | |
616 } | |
617 | |
618 // diagonal matrix by column vector -> column vector operations | |
619 | |
620 ComplexColumnVector | |
621 operator * (const DiagMatrix& m, const ComplexColumnVector& a) | |
622 { | |
623 int nr = m.rows (); | |
624 int nc = m.cols (); | |
625 int a_len = a.length (); | |
626 if (nc != a_len) | |
627 { | |
628 (*current_liboctave_error_handler) | |
629 ("nonconformant matrix multiplication attempted"); | |
630 return ColumnVector (); | |
631 } | |
632 | |
633 if (nc == 0 || nr == 0) | |
634 return ComplexColumnVector (0); | |
635 | |
636 ComplexColumnVector result (nr); | |
637 | |
638 for (int i = 0; i < a_len; i++) | |
639 result.elem (i) = a.elem (i) * m.elem (i, i); | |
640 | |
641 for (i = a_len; i < nr; i++) | |
642 result.elem (i) = 0.0; | |
643 | |
644 return result; | |
645 } | |
646 | |
647 ComplexColumnVector | |
648 operator * (const ComplexDiagMatrix& m, const ColumnVector& a) | |
649 { | |
650 int nr = m.rows (); | |
651 int nc = m.cols (); | |
652 int a_len = a.length (); | |
653 if (nc != a_len) | |
654 { | |
655 (*current_liboctave_error_handler) | |
656 ("nonconformant matrix muliplication attempted"); | |
657 return ComplexColumnVector (); | |
658 } | |
659 | |
660 if (nc == 0 || nr == 0) | |
661 return ComplexColumnVector (0); | |
662 | |
663 ComplexColumnVector result (nr); | |
664 | |
665 for (int i = 0; i < a_len; i++) | |
666 result.elem (i) = a.elem (i) * m.elem (i, i); | |
667 | |
668 for (i = a_len; i < nr; i++) | |
669 result.elem (i) = 0.0; | |
670 | |
671 return result; | |
672 } | |
673 | |
674 ComplexColumnVector | |
675 operator * (const ComplexDiagMatrix& m, const ComplexColumnVector& a) | |
676 { | |
677 int nr = m.rows (); | |
678 int nc = m.cols (); | |
679 int a_len = a.length (); | |
680 if (nc != a_len) | |
681 { | |
682 (*current_liboctave_error_handler) | |
683 ("nonconformant matrix muliplication attempted"); | |
684 return ComplexColumnVector (); | |
685 } | |
686 | |
687 if (nc == 0 || nr == 0) | |
688 return ComplexColumnVector (0); | |
689 | |
690 ComplexColumnVector result (nr); | |
691 | |
692 for (int i = 0; i < a_len; i++) | |
693 result.elem (i) = a.elem (i) * m.elem (i, i); | |
694 | |
695 for (i = a_len; i < nr; i++) | |
696 result.elem (i) = 0.0; | |
697 | |
698 return result; | |
549 } | 699 } |
550 | 700 |
551 // other operations | 701 // other operations |
552 | 702 |
553 ComplexColumnVector | 703 ComplexColumnVector |
554 map (c_c_Mapper f, const ComplexColumnVector& a) | 704 map (c_c_Mapper f, const ComplexColumnVector& a) |
555 { | 705 { |
556 ComplexColumnVector b (a); | 706 ComplexColumnVector b (a); |
557 b.map (f); | 707 b.map (f); |
558 return b; | |
559 } | |
560 | |
561 ColumnVector | |
562 map (d_c_Mapper f, const ComplexColumnVector& a) | |
563 { | |
564 int a_len = a.length (); | |
565 ColumnVector b (a_len); | |
566 for (int i = 0; i < a_len; i++) | |
567 b.elem (i) = f (a.elem (i)); | |
568 return b; | 708 return b; |
569 } | 709 } |
570 | 710 |
571 void | 711 void |
572 ComplexColumnVector::map (c_c_Mapper f) | 712 ComplexColumnVector::map (c_c_Mapper f) |