Mercurial > hg > octave-nkf
diff doc/interpreter/matrix.txi @ 3294:bfe1573bd2ae
[project @ 1999-10-19 10:06:07 by jwe]
author | jwe |
---|---|
date | Tue, 19 Oct 1999 10:08:42 +0000 |
parents | |
children | f37ca3017116 |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/doc/interpreter/matrix.txi @@ -0,0 +1,792 @@ +@c Copyright (C) 1996, 1997 John W. Eaton +@c This is part of the Octave manual. +@c For copying conditions, see the file gpl.texi. + +@node Matrix Manipulation, Arithmetic, Plotting, Top +@chapter Matrix Manipulation + +There are a number of functions available for checking to see if the +elements of a matrix meet some condition, and for rearranging the +elements of a matrix. For example, Octave can easily tell you if all +the elements of a matrix are finite, or are less than some specified +value. Octave can also rotate the elements, extract the upper- or +lower-triangular parts, or sort the columns of a matrix. + +@menu +* Finding Elements and Checking Conditions:: +* Rearranging Matrices:: +* Special Utility Matrices:: +* Famous Matrices:: +@end menu + +@node Finding Elements and Checking Conditions, Rearranging Matrices, Matrix Manipulation, Matrix Manipulation +@section Finding Elements and Checking Conditions + +The functions @code{any} and @code{all} are useful for determining +whether any or all of the elements of a matrix satisfy some condition. +The @code{find} function is also useful in determining which elements of +a matrix meet a specified condition. + +@deftypefn {Built-in Function} {} any (@var{x}) +For a vector argument, return 1 if any element of the vector is +nonzero. + +For a matrix argument, return a row vector of ones and +zeros with each element indicating whether any of the elements of the +corresponding column of the matrix are nonzero. For example, + +@example +@group +any (eye (2, 4)) + @result{} [ 1, 1, 0, 0 ] +@end group +@end example + +To see if any of the elements of a matrix are nonzero, you can use a +statement like + +@example +any (any (a)) +@end example +@end deftypefn + +@deftypefn {Built-in Function} {} all (@var{x}) +The function @code{all} behaves like the function @code{any}, except +that it returns true only if all the elements of a vector, or all the +elements in a column of a matrix, are nonzero. +@end deftypefn + +Since the comparison operators (@pxref{Comparison Ops}) return matrices +of ones and zeros, it is easy to test a matrix for many things, not just +whether the elements are nonzero. For example, + +@example +@group +all (all (rand (5) < 0.9)) + @result{} 0 +@end group +@end example + +@noindent +tests a random 5 by 5 matrix to see if all of its elements are less +than 0.9. + +Note that in conditional contexts (like the test clause of @code{if} and +@code{while} statements) Octave treats the test as if you had typed +@code{all (all (condition))}. + +@deftypefn {Function File} {[@var{err}, @var{y1}, ...] =} common_size (@var{x1}, ...) +Determine if all input arguments are either scalar or of common +size. If so, @var{err} is zero, and @var{yi} is a matrix of the +common size with all entries equal to @var{xi} if this is a scalar or +@var{xi} otherwise. If the inputs cannot be brought to a common size, +errorcode is 1, and @var{yi} is @var{xi}. For example, + +@example +@group +[errorcode, a, b] = common_size ([1 2; 3 4], 5) + @result{} errorcode = 0 + @result{} a = [ 1, 2; 3, 4 ] + @result{} b = [ 5, 5; 5, 5 ] +@end group +@end example + +@noindent +This is useful for implementing functions where arguments can either +be scalars or of common size. +@end deftypefn + +@deftypefn {Function File} {} diff (@var{x}, @var{k}) +If @var{x} is a vector of length @var{n}, @code{diff (@var{x})} is the +vector of first differences +@iftex +@tex + $x_2 - x_1, \ldots{}, x_n - x_{n-1}$. +@end tex +@end iftex +@ifinfo + @var{x}(2) - @var{x}(1), @dots{}, @var{x}(n) - @var{x}(n-1). +@end ifinfo + +If @var{x} is a matrix, @code{diff (@var{x})} is the matrix of column +differences. + +The second argument is optional. If supplied, @code{diff (@var{x}, +@var{k})}, where @var{k} is a nonnegative integer, returns the +@var{k}-th differences. +@end deftypefn + +@deftypefn {Mapping Function} {} isinf (@var{x}) +Return 1 for elements of @var{x} that are infinite and zero +otherwise. For example, + +@example +@group +isinf ([13, Inf, NaN]) + @result{} [ 0, 1, 0 ] +@end group +@end example +@end deftypefn + +@deftypefn {Mapping Function} {} isnan (@var{x}) +Return 1 for elements of @var{x} that are NaN values and zero +otherwise. For example, + +@example +@group +isnan ([13, Inf, NaN]) + @result{} [ 0, 0, 1 ] +@end group +@end example +@end deftypefn + +@deftypefn {Mapping Function} {} finite (@var{x}) +Return 1 for elements of @var{x} that are NaN values and zero +otherwise. For example, + +@example +@group +finite ([13, Inf, NaN]) + @result{} [ 1, 0, 0 ] +@end group +@end example +@end deftypefn + +@deftypefn {Loadable Function} {} find (@var{x}) +Return a vector of indices of nonzero elements of a matrix. To obtain a +single index for each matrix element, Octave pretends that the columns +of a matrix form one long vector (like Fortran arrays are stored). For +example, + +@example +@group +find (eye (2)) + @result{} [ 1; 4 ] +@end group +@end example + +If two outputs are requested, @code{find} returns the row and column +indices of nonzero elements of a matrix. For example, + +@example +@group +[i, j] = find (2 * eye (2)) + @result{} i = [ 1; 2 ] + @result{} j = [ 1; 2 ] +@end group +@end example + +If three outputs are requested, @code{find} also returns a vector +containing the nonzero values. For example, + +@example +@group +[i, j, v] = find (3 * eye (2)) + @result{} i = [ 1; 2 ] + @result{} j = [ 1; 2 ] + @result{} v = [ 3; 3 ] +@end group +@end example +@end deftypefn + +@node Rearranging Matrices, Special Utility Matrices, Finding Elements and Checking Conditions, Matrix Manipulation +@section Rearranging Matrices + +@deftypefn {Function File} {} fliplr (@var{x}) +Return a copy of @var{x} with the order of the columns reversed. For +example, + +@example +@group +fliplr ([1, 2; 3, 4]) + @result{} 2 1 + 4 3 +@end group +@end example +@end deftypefn + +@deftypefn {Function File} {} flipud (@var{x}) +Return a copy of @var{x} with the order of the rows reversed. For +example, + +@example +@group +flipud ([1, 2; 3, 4]) + @result{} 3 4 + 1 2 +@end group +@end example +@end deftypefn + +@deftypefn {Function File} {} rot90 (@var{x}, @var{n}) +Return a copy of @var{x} with the elements rotated counterclockwise in +90-degree increments. The second argument is optional, and specifies +how many 90-degree rotations are to be applied (the default value is 1). +Negative values of @var{n} rotate the matrix in a clockwise direction. +For example, + +@example +@group +rot90 ([1, 2; 3, 4], -1) + @result{} 3 1 + 4 2 +@end group +@end example + +@noindent +rotates the given matrix clockwise by 90 degrees. The following are all +equivalent statements: + +@example +@group +rot90 ([1, 2; 3, 4], -1) +@equiv{} +rot90 ([1, 2; 3, 4], 3) +@equiv{} +rot90 ([1, 2; 3, 4], 7) +@end group +@end example +@end deftypefn + +@deftypefn {Function File} {} reshape (@var{a}, @var{m}, @var{n}) +Return a matrix with @var{m} rows and @var{n} columns whose elements are +taken from the matrix @var{a}. To decide how to order the elements, +Octave pretends that the elements of a matrix are stored in column-major +order (like Fortran arrays are stored). + +For example, + +@example +@group +reshape ([1, 2, 3, 4], 2, 2) + @result{} 1 3 + 2 4 +@end group +@end example + +If the variable @code{do_fortran_indexing} is nonzero, the +@code{reshape} function is equivalent to + +@example +@group +retval = zeros (m, n); +retval (:) = a; +@end group +@end example + +@noindent +but it is somewhat less cryptic to use @code{reshape} instead of the +colon operator. Note that the total number of elements in the original +matrix must match the total number of elements in the new matrix. +@end deftypefn + +@deftypefn {Function File} {} shift (@var{x}, @var{b}) +If @var{x} is a vector, perform a circular shift of length @var{b} of +the elements of @var{x}. + +If @var{x} is a matrix, do the same for each column of @var{x}. +@end deftypefn + +@deftypefn {Loadable Function} {[@var{s}, @var{i}] =} sort (@var{x}) +Return a copy of @var{x} with the elements elements arranged in +increasing order. For matrices, @code{sort} orders the elements in each +column. + +For example, + +@example +@group +sort ([1, 2; 2, 3; 3, 1]) + @result{} 1 1 + 2 2 + 3 3 +@end group +@end example + +The @code{sort} function may also be used to produce a matrix +containing the original row indices of the elements in the sorted +matrix. For example, + +@example +@group +[s, i] = sort ([1, 2; 2, 3; 3, 1]) + @result{} s = 1 1 + 2 2 + 3 3 + @result{} i = 1 3 + 2 1 + 3 2 +@end group +@end example +@end deftypefn + +Since the @code{sort} function does not allow sort keys to be specified, +it can't be used to order the rows of a matrix according to the values +of the elements in various columns@footnote{For example, to first sort +based on the values in column 1, and then, for any values that are +repeated in column 1, sort based on the values found in column 2, etc.} +in a single call. Using the second output, however, it is possible to +sort all rows based on the values in a given column. Here's an example +that sorts the rows of a matrix based on the values in the second +column. + +@example +@group +a = [1, 2; 2, 3; 3, 1]; +[s, i] = sort (a (:, 2)); +a (i, :) + @result{} 3 1 + 1 2 + 2 3 +@end group +@end example + +@deftypefn {Function File} {} tril (@var{a}, @var{k}) +@deftypefnx {Function File} {} triu (@var{a}, @var{k}) +Return a new matrix formed by extracting extract the lower (@code{tril}) +or upper (@code{triu}) triangular part of the matrix @var{a}, and +setting all other elements to zero. The second argument is optional, +and specifies how many diagonals above or below the main diagonal should +also be set to zero. + +The default value of @var{k} is zero, so that @code{triu} and +@code{tril} normally include the main diagonal as part of the result +matrix. + +If the value of @var{k} is negative, additional elements above (for +@code{tril}) or below (for @code{triu}) the main diagonal are also +selected. + +The absolute value of @var{k} must not be greater than the number of +sub- or super-diagonals. + +For example, + +@example +@group +tril (ones (3), -1) + @result{} 0 0 0 + 1 0 0 + 1 1 0 +@end group +@end example + +@noindent +and + +@example +@group +tril (ones (3), 1) + @result{} 1 1 0 + 1 1 1 + 1 1 1 +@end group +@end example +@end deftypefn + +@deftypefn {Function File} {} vec (@var{x}) +Return the vector obtained by stacking the columns of the matrix @var{x} +one above the other. +@end deftypefn + +@deftypefn {Function File} {} vech (@var{x}) +Return the vector obtained by eliminating all supradiagonal elements of +the square matrix @var{x} and stacking the result one column above the +other. +@end deftypefn + +@node Special Utility Matrices, Famous Matrices, Rearranging Matrices, Matrix Manipulation +@section Special Utility Matrices + +@deftypefn {Built-in Function} {} eye (@var{x}) +@deftypefnx {Built-in Function} {} eye (@var{n}, @var{m}) +Return an identity matrix. If invoked with a single scalar argument, +@code{eye} returns a square matrix with the dimension specified. If you +supply two scalar arguments, @code{eye} takes them to be the number of +rows and columns. If given a vector with two elements, @code{eye} uses +the values of the elements as the number of rows and columns, +respectively. For example, + +@example +@group +eye (3) + @result{} 1 0 0 + 0 1 0 + 0 0 1 +@end group +@end example + +The following expressions all produce the same result: + +@example +@group +eye (2) +@equiv{} +eye (2, 2) +@equiv{} +eye (size ([1, 2; 3, 4]) +@end group +@end example + +For compatibility with @sc{Matlab}, calling @code{eye} with no arguments +is equivalent to calling it with an argument of 1. +@end deftypefn + +@deftypefn {Built-in Function} {} ones (@var{x}) +@deftypefnx {Built-in Function} {} ones (@var{n}, @var{m}) +Return a matrix whose elements are all 1. The arguments are handled +the same as the arguments for @code{eye}. + +If you need to create a matrix whose values are all the same, you should +use an expression like + +@example +val_matrix = val * ones (n, m) +@end example +@end deftypefn + +@deftypefn {Built-in Function} {} zeros (@var{x}) +@deftypefnx {Built-in Function} {} zeros (@var{n}, @var{m}) +Return a matrix whose elements are all 0. The arguments are handled +the same as the arguments for @code{eye}. +@end deftypefn + +@deftypefn {Loadable Function} {} rand (@var{x}) +@deftypefnx {Loadable Function} {} rand (@var{n}, @var{m}) +@deftypefnx {Loadable Function} {} rand (@code{"seed"}, @var{x}) +Return a matrix with random elements uniformly distributed on the +interval (0, 1). The arguments are handled the same as the arguments +for @code{eye}. In +addition, you can set the seed for the random number generator using the +form + +@example +rand ("seed", @var{x}) +@end example + +@noindent +where @var{x} is a scalar value. If called as + +@example +rand ("seed") +@end example + +@noindent +@code{rand} returns the current value of the seed. +@end deftypefn + +@deftypefn {Loadable Function} {} randn (@var{x}) +@deftypefnx {Loadable Function} {} randn (@var{n}, @var{m}) +@deftypefnx {Loadable Function} {} randn (@code{"seed"}, @var{x}) +Return a matrix with normally distributed random elements. The +arguments are handled the same as the arguments for @code{eye}. In +addition, you can set the seed for the random number generator using the +form + +@example +randn ("seed", @var{x}) +@end example + +@noindent +where @var{x} is a scalar value. If called as + +@example +randn ("seed") +@end example + +@noindent +@code{randn} returns the current value of the seed. +@end deftypefn + +The @code{rand} and @code{randn} functions use separate generators. +This ensures that + +@example +@group +rand ("seed", 13); +randn ("seed", 13); +u = rand (100, 1); +n = randn (100, 1); +@end group +@end example + +@noindent +and + +@example +@group +rand ("seed", 13); +randn ("seed", 13); +u = zeros (100, 1); +n = zeros (100, 1); +for i = 1:100 + u(i) = rand (); + n(i) = randn (); +end +@end group +@end example + +@noindent +produce equivalent results. + +Normally, @code{rand} and @code{randn} obtain their initial +seeds from the system clock, so that the sequence of random numbers is +not the same each time you run Octave. If you really do need for to +reproduce a sequence of numbers exactly, you can set the seed to a +specific value. + +If it is invoked without arguments, @code{rand} and @code{randn} return a +single element of a random sequence. + +The @code{rand} and @code{randn} functions use Fortran code from +@sc{Ranlib}, a library of fortran routines for random number generation, +compiled by Barry W. Brown and James Lovato of the Department of +Biomathematics at The University of Texas, M.D. Anderson Cancer Center, +Houston, TX 77030. + +@deftypefn {Built-in Function} {} diag (@var{v}, @var{k}) +Return a diagonal matrix with vector @var{v} on diagonal @var{k}. The +second argument is optional. If it is positive, the vector is placed on +the @var{k}-th super-diagonal. If it is negative, it is placed on the +@var{-k}-th sub-diagonal. The default value of @var{k} is 0, and the +vector is placed on the main diagonal. For example, + +@example +@group +diag ([1, 2, 3], 1) + @result{} 0 1 0 0 + 0 0 2 0 + 0 0 0 3 + 0 0 0 0 +@end group +@end example +@end deftypefn + +@c XXX FIXME XXX -- is this really worth documenting? +@c +@c @defvr {Built-in Variable} ok_to_lose_imaginary_part +@c If the value of @code{ok_to_lose_imaginary_part} is nonzero, implicit +@c conversions of complex numbers to real numbers are allowed (for example, +@c by fsolve). If the value is @code{"warn"}, the conversion is allowed, +@c but a warning is printed. Otherwise, an error message is printed and +@c control is returned to the top level. The default value is +@c @code{"warn"}. +@c +@c XXX FIXME XXX -- this is here because it is used by @code{ones}, +@c @code{zeros}, @code{rand}, etc. +@c @end defvr + +The functions @code{linspace} and @code{logspace} make it very easy to +create vectors with evenly or logarithmically spaced elements. +@xref{Ranges}. + +@deftypefn {Function File} {} linspace (@var{base}, @var{limit}, @var{n}) +Return a row vector with @var{n} linearly spaced elements between +@var{base} and @var{limit}. The number of elements, @var{n}, must be +greater than 1. The @var{base} and @var{limit} are always included in +the range. If @var{base} is greater than @var{limit}, the elements are +stored in decreasing order. If the number of points is not specified, a +value of 100 is used. + +The @code{linspace} function always returns a row vector, regardless of +the value of @code{prefer_column_vectors}. +@end deftypefn + +@deftypefn {Function File} {} logspace (@var{base}, @var{limit}, @var{n}) +Similar to @code{linspace} except that the values are logarithmically +spaced from +@iftex +@tex +$10^{base}$ to $10^{limit}$. +@end tex +@end iftex +@ifinfo +10^base to 10^limit. +@end ifinfo + +If @var{limit} is equal to +@iftex +@tex +$\pi$, +@end tex +@end iftex +@ifinfo +pi, +@end ifinfo +the points are between +@iftex +@tex +$10^{base}$ and $\pi$, +@end tex +@end iftex +@ifinfo +10^base and pi, +@end ifinfo +@emph{not} +@iftex +@tex +$10^{base}$ and $10^{\pi}$, +@end tex +@end iftex +@ifinfo +10^base and 10^pi, +@end ifinfo +in order to be compatible with the corresponding @sc{Matlab} function. +@end deftypefn + +@defvr {Built-in Variable} treat_neg_dim_as_zero +If the value of @code{treat_neg_dim_as_zero} is nonzero, expressions +like + +@example +eye (-1) +@end example + +@noindent +produce an empty matrix (i.e., row and column dimensions are zero). +Otherwise, an error message is printed and control is returned to the +top level. The default value is 0. +@end defvr + +@node Famous Matrices, , Special Utility Matrices, Matrix Manipulation +@section Famous Matrices + +The following functions return famous matrix forms. + +@deftypefn {Function File} {} hankel (@var{c}, @var{r}) +Return the Hankel matrix constructed given the first column @var{c}, and +(optionally) the last row @var{r}. If the last element of @var{c} is +not the same as the first element of @var{r}, the last element of +@var{c} is used. If the second argument is omitted, the last row is +taken to be the same as the first column. + +A Hankel matrix formed from an m-vector @var{c}, and an n-vector +@var{r}, has the elements +@iftex +@tex +$$ +H (i, j) = \cases{c_{i+j-1},&$i+j-1\le m$;\cr r_{i+j-m},&otherwise.\cr} +$$ +@end tex +@end iftex +@ifinfo + +@example +@group +H (i, j) = c (i+j-1), i+j-1 <= m; +H (i, j) = r (i+j-m), otherwise +@end group +@end example +@end ifinfo +@end deftypefn + +@deftypefn {Function File} {} hilb (@var{n}) +Return the Hilbert matrix of order @var{n}. The +@iftex +@tex +$i,\,j$ +@end tex +@end iftex +@ifinfo +i, j +@end ifinfo +element of a Hilbert matrix is defined as +@iftex +@tex +$$ +H (i, j) = {1 \over (i + j - 1)} +$$ +@end tex +@end iftex +@ifinfo + +@example +H (i, j) = 1 / (i + j - 1) +@end example +@end ifinfo +@end deftypefn + +@deftypefn {Function File} {} invhilb (@var{n}) +Return the inverse of a Hilbert matrix of order @var{n}. This is exact. +Compare with the numerical calculation of @code{inverse (hilb (n))}, +which suffers from the ill-conditioning of the Hilbert matrix, and the +finite precision of your computer's floating point arithmetic. +@end deftypefn + +@deftypefn {Function File} {} sylvester_matrix (@var{k}) +Return the Sylvester matrix of order +@iftex +@tex +$n = 2^k$. +@end tex +@end iftex +@ifinfo +n = 2^k. +@end ifinfo +@end deftypefn + +@deftypefn {Function File} {} toeplitz (@var{c}, @var{r}) +Return the Toeplitz matrix constructed given the first column @var{c}, +and (optionally) the first row @var{r}. If the first element of @var{c} +is not the same as the first element of @var{r}, the first element of +@var{c} is used. If the second argument is omitted, the first row is +taken to be the same as the first column. + +A square Toeplitz matrix has the form +@iftex +@tex +$$ +\left[\matrix{c_0 & r_1 & r_2 & \ldots & r_n\cr + c_1 & c_0 & r_1 & & c_{n-1}\cr + c_2 & c_1 & c_0 & & c_{n-2}\cr + \vdots & & & & \vdots\cr + c_n & c_{n-1} & c_{n-2} & \ldots & c_0}\right]. +$$ +@end tex +@end iftex +@ifinfo + +@example +@group +c(0) r(1) r(2) ... r(n) +c(1) c(0) r(1) r(n-1) +c(2) c(1) c(0) r(n-2) + . . + . . + . . + +c(n) c(n-1) c(n-2) ... c(0) +@end group +@end example +@end ifinfo +@end deftypefn + +@deftypefn {Function File} {} vander (@var{c}) +Return the Vandermonde matrix whose next to last column is @var{c}. + +A Vandermonde matrix has the form +@iftex +@tex +$$ +\left[\matrix{c_0^n & \ldots & c_0^2 & c_0 & 1\cr + c_1^n & \ldots & c_1^2 & c_1 & 1\cr + \vdots & & \vdots & \vdots & \vdots\cr + c_n^n & \ldots & c_n^2 & c_n & 1}\right]. +$$ +@end tex +@end iftex +@ifinfo + +@example +@group +c(0)^n ... c(0)^2 c(0) 1 +c(1)^n ... c(1)^2 c(1) 1 + . . . . + . . . . + . . . . + +c(n)^n ... c(n)^2 c(n) 1 +@end group +@end example +@end ifinfo +@end deftypefn