comparison src/data.cc @ 6979:2883ea1c5c18

[project @ 2007-10-08 20:23:48 by dbateman]
author dbateman
date Mon, 08 Oct 2007 20:26:01 +0000
parents 47f4f4e88166
children 9325d3f604a3
comparison
equal deleted inserted replaced
6978:b75630794a11 6979:2883ea1c5c18
431 @end deftypefn") 431 @end deftypefn")
432 { 432 {
433 DATA_REDUCTION (cumsum); 433 DATA_REDUCTION (cumsum);
434 } 434 }
435 435
436 // FIXME -- we could eliminate some duplicate code here with 436 template <class T>
437 // some template functions or macros.
438
439 static octave_value 437 static octave_value
440 make_diag (const Matrix& v, octave_idx_type k) 438 make_diag (const T& v, octave_idx_type k)
441 { 439 {
442 octave_idx_type nr = v.rows (); 440 octave_value retval;
443 octave_idx_type nc = v.columns (); 441 dim_vector dv = v.dims ();
444 assert (nc == 1 || nr == 1); 442 octave_idx_type nd = dv.length ();
445 443
446 octave_value retval; 444 if (nd > 2)
447 445 error ("diag: expecting 2-dimensional matrix");
448 octave_idx_type roff = 0; 446 else
449 octave_idx_type coff = 0; 447 {
450 if (k > 0) 448 octave_idx_type nr = dv (0);
451 { 449 octave_idx_type nc = dv (1);
452 roff = 0; 450
453 coff = k; 451 if (nr == 0 || nc == 0)
454 } 452 retval = T ();
455 else if (k < 0) 453 else if (nr != 1 && nc != 1)
456 { 454 retval = v.diag (k);
457 roff = -k; 455 else
458 coff = 0; 456 {
459 } 457 octave_idx_type roff = 0;
460 458 octave_idx_type coff = 0;
461 if (nr == 1) 459 if (k > 0)
462 { 460 {
463 octave_idx_type n = nc + std::abs (k); 461 roff = 0;
464 Matrix m (n, n, 0.0); 462 coff = k;
465 for (octave_idx_type i = 0; i < nc; i++) 463 }
466 m (i+roff, i+coff) = v (0, i); 464 else if (k < 0)
467 retval = m; 465 {
468 } 466 roff = -k;
469 else 467 coff = 0;
470 { 468 }
471 octave_idx_type n = nr + std::abs (k); 469
472 Matrix m (n, n, 0.0); 470 if (nr == 1)
473 for (octave_idx_type i = 0; i < nr; i++) 471 {
474 m (i+roff, i+coff) = v (i, 0); 472 octave_idx_type n = nc + std::abs (k);
475 retval = m; 473 T m (dim_vector (n, n), T::resize_fill_value ());
476 } 474
477 475 for (octave_idx_type i = 0; i < nc; i++)
478 return retval; 476 m (i+roff, i+coff) = v (0, i);
479 } 477 retval = m;
480 478 }
479 else
480 {
481 octave_idx_type n = nr + std::abs (k);
482 T m (dim_vector (n, n), T::resize_fill_value ());
483 for (octave_idx_type i = 0; i < nr; i++)
484 m (i+roff, i+coff) = v (i, 0);
485 retval = m;
486 }
487 }
488 }
489
490 return retval;
491 }
492
493 #if !defined (CXX_NEW_FRIEND_TEMPLATE_DECL)
481 static octave_value 494 static octave_value
482 make_diag (const ComplexMatrix& v, octave_idx_type k) 495 make_diag (const Matrix& v, octave_idx_type k);
483 { 496
484 octave_idx_type nr = v.rows (); 497 static octave_value
485 octave_idx_type nc = v.columns (); 498 make_diag (const ComplexMatrix& v, octave_idx_type k);
486 assert (nc == 1 || nr == 1); 499
487 500 static octave_value
488 octave_value retval; 501 make_diag (const charMatrix& v, octave_idx_type k);
489 502
490 octave_idx_type roff = 0; 503 static octave_value
491 octave_idx_type coff = 0; 504 make_diag (const boolMatrix& v, octave_idx_type k);
492 if (k > 0) 505
493 { 506 static octave_value
494 roff = 0; 507 make_diag (const int8NDArray& v, octave_idx_type k);
495 coff = k; 508
496 } 509 static octave_value
497 else if (k < 0) 510 make_diag (const int16NDArray& v, octave_idx_type k);
498 { 511
499 roff = -k; 512 static octave_value
500 coff = 0; 513 make_diag (const int32NDArray& v, octave_idx_type k);
501 } 514
502 515 static octave_value
503 if (nr == 1) 516 make_diag (const int64NDArray& v, octave_idx_type k);
504 { 517
505 octave_idx_type n = nc + std::abs (k); 518 static octave_value
506 ComplexMatrix m (n, n, 0.0); 519 make_diag (const uint8NDArray& v, octave_idx_type k);
507 for (octave_idx_type i = 0; i < nc; i++) 520
508 m (i+roff, i+coff) = v (0, i); 521 static octave_value
509 retval = m; 522 make_diag (const uint16NDArray& v, octave_idx_type k);
510 } 523
511 else 524 static octave_value
512 { 525 make_diag (const uint32NDArray& v, octave_idx_type k);
513 octave_idx_type n = nr + std::abs (k); 526
514 ComplexMatrix m (n, n, 0.0); 527 static octave_value
515 for (octave_idx_type i = 0; i < nr; i++) 528 make_diag (const uint64NDArray& v, octave_idx_type k);
516 m (i+roff, i+coff) = v (i, 0); 529 #endif
517 retval = m; 530
518 } 531 static octave_value
532 make_diag (const octave_value& a, octave_idx_type k)
533 {
534 octave_value retval;
535 std::string result_type = a.class_name ();
536
537 if (result_type == "double")
538 {
539 if (a.is_real_type ())
540 {
541 Matrix m = a.matrix_value ();
542 if (!error_state)
543 retval = make_diag (m, k);
544 }
545 else
546 {
547 ComplexMatrix m = a.complex_matrix_value ();
548 if (!error_state)
549 retval = make_diag (m, k);
550 }
551 }
552 #if 0
553 else if (result_type == "single")
554 retval = make_diag (a.single_array_value (), k);
555 #endif
556 else if (result_type == "char")
557 {
558 charMatrix m = a.char_matrix_value ();
559 if (!error_state)
560 {
561 retval = make_diag (m, k);
562 if (a.is_sq_string ())
563 retval = octave_value (retval.char_array_value (), true, '\'');
564 }
565 }
566 else if (result_type == "logical")
567 {
568 boolMatrix m = a.bool_matrix_value ();
569 if (!error_state)
570 retval = make_diag (m, k);
571 }
572 else if (result_type == "int8")
573 retval = make_diag (a.int8_array_value (), k);
574 else if (result_type == "int16")
575 retval = make_diag (a.int16_array_value (), k);
576 else if (result_type == "int32")
577 retval = make_diag (a.int32_array_value (), k);
578 else if (result_type == "int64")
579 retval = make_diag (a.int64_array_value (), k);
580 else if (result_type == "uint8")
581 retval = make_diag (a.uint8_array_value (), k);
582 else if (result_type == "uint16")
583 retval = make_diag (a.uint16_array_value (), k);
584 else if (result_type == "uint32")
585 retval = make_diag (a.uint32_array_value (), k);
586 else if (result_type == "uint64")
587 retval = make_diag (a.uint64_array_value (), k);
588 else
589 gripe_wrong_type_arg ("diag", a);
519 590
520 return retval; 591 return retval;
521 } 592 }
522 593
523 static octave_value 594 static octave_value
524 make_diag (const octave_value& arg) 595 make_diag (const octave_value& arg)
525 { 596 {
526 octave_value retval; 597 return make_diag (arg, 0);
527
528 if (arg.is_real_type ())
529 {
530 Matrix m = arg.matrix_value ();
531
532 if (! error_state)
533 {
534 octave_idx_type nr = m.rows ();
535 octave_idx_type nc = m.columns ();
536
537 if (nr == 0 || nc == 0)
538 retval = Matrix ();
539 else if (nr == 1 || nc == 1)
540 retval = make_diag (m, 0);
541 else
542 {
543 ColumnVector v = m.diag ();
544 if (v.numel () > 0)
545 retval = v;
546 }
547 }
548 else
549 gripe_wrong_type_arg ("diag", arg);
550 }
551 else if (arg.is_complex_type ())
552 {
553 ComplexMatrix cm = arg.complex_matrix_value ();
554
555 if (! error_state)
556 {
557 octave_idx_type nr = cm.rows ();
558 octave_idx_type nc = cm.columns ();
559
560 if (nr == 0 || nc == 0)
561 retval = Matrix ();
562 else if (nr == 1 || nc == 1)
563 retval = make_diag (cm, 0);
564 else
565 {
566 ComplexColumnVector v = cm.diag ();
567 if (v.numel () > 0)
568 retval = v;
569 }
570 }
571 else
572 gripe_wrong_type_arg ("diag", arg);
573 }
574 else
575 gripe_wrong_type_arg ("diag", arg);
576
577 return retval;
578 } 598 }
579 599
580 static octave_value 600 static octave_value
581 make_diag (const octave_value& a, const octave_value& b) 601 make_diag (const octave_value& a, const octave_value& b)
582 { 602 {
583 octave_value retval; 603 octave_value retval;
584 604
585 octave_idx_type k = b.int_value (); 605 octave_idx_type k = b.int_value ();
586 606
587 if (error_state) 607 if (error_state)
588 { 608 error ("diag: invalid second argument");
589 error ("diag: invalid second argument"); 609 else
590 return retval; 610 retval = make_diag (a, k);
591 }
592
593 if (a.is_real_type ())
594 {
595 Matrix m = a.matrix_value ();
596
597 if (! error_state)
598 {
599 octave_idx_type nr = m.rows ();
600 octave_idx_type nc = m.columns ();
601
602 if (nr == 1 || nc == 1)
603 retval = make_diag (m, k);
604 else if (nr == 0 || nc == 0)
605 retval = Matrix ();
606 else
607 {
608 ColumnVector d = m.diag (k);
609 retval = d;
610 }
611 }
612 }
613 else if (a.is_complex_type ())
614 {
615 ComplexMatrix cm = a.complex_matrix_value ();
616
617 if (! error_state)
618 {
619 octave_idx_type nr = cm.rows ();
620 octave_idx_type nc = cm.columns ();
621
622 if (nr == 1 || nc == 1)
623 retval = make_diag (cm, k);
624 else if (nr == 0 || nc == 0)
625 retval = Matrix ();
626 else
627 {
628 ComplexColumnVector d = cm.diag (k);
629 retval = d;
630 }
631 }
632 }
633 else
634 gripe_wrong_type_arg ("diag", a);
635 611
636 return retval; 612 return retval;
637 } 613 }
638 614
639 DEFUN (diag, args, , 615 DEFUN (diag, args, ,