home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / octave-1.1.1p1-src.tgz / tar.out / fsf / octave / scripts / special-matrix / hankel.m < prev    next >
Text File  |  1996-09-28  |  2KB  |  78 lines

  1. # Copyright (C) 1993, 1994, 1995 John W. Eaton
  2. # This file is part of Octave.
  3. # Octave is free software; you can redistribute it and/or modify it
  4. # under the terms of the GNU General Public License as published by the
  5. # Free Software Foundation; either version 2, or (at your option) any
  6. # later version.
  7. # Octave is distributed in the hope that it will be useful, but WITHOUT
  8. # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  9. # FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  10. # for more details.
  11. # You should have received a copy of the GNU General Public License
  12. # along with Octave; see the file COPYING.  If not, write to the Free
  13. # Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  14.  
  15. function retval = hankel (c, r)
  16.  
  17. # usage: hankel (c, r)
  18. #
  19. # Return the Hankel matrix constructed given the first column
  20. # c, and (optionally) the last row r.
  21. #
  22. # If the second argument is omitted, the last row is taken to be the
  23. # same as the first column.  If the last element of c is not the same
  24. # as the first element of r, the last element of c is used.
  25. #
  26. # See also: vander, hadamard, hilb, invhilb, toeplitz
  27.  
  28.   if (nargin == 1)
  29.     r = c;
  30.   elseif (nargin != 2)
  31.     usage ("hankel (c, r)");
  32.   endif
  33.  
  34.   [c_nr, c_nc] = size (c);
  35.   [r_nr, r_nc] = size (r);
  36.  
  37.   if ((c_nr != 1 && c_nc != 1) || (r_nr != 1 && r_nc != 1))
  38.     error ("hankel: expecting vector arguments")
  39.   endif
  40.  
  41.   if (c_nc != 1)
  42.     c = c.';
  43.   endif
  44.  
  45.   if (r_nr != 1)
  46.     r = r.';
  47.   endif
  48.  
  49.   if (r (1) != c (1))
  50.     warning ("hankel: column wins anti-diagonal conflict");
  51.   endif
  52.  
  53. # This should probably be done with the colon operator...
  54.  
  55.   nc = length (r);
  56.   nr = length (c);
  57.  
  58.   retval = zeros (nr, nc);
  59.  
  60.   for i = 1:min (nr, nc)
  61.     retval (1:nr-i+1, i) = c (i:nr);
  62.   endfor
  63.  
  64.   tmp = 1;
  65.   if (nc <= nr)
  66.     tmp = nr - nc + 2;
  67.   endif
  68.  
  69.   for i = nr:-1:tmp
  70.     retval (i, 2+nr-i:nc) = r (2:nc-nr+i);
  71.   endfor
  72.  
  73. endfunction
  74.