This is Info file octave.info, produced by Makeinfo-1.55 from the input
file octave.texi.

   Copyright (C) 1993, 1994, 1995 John W. Eaton.

   Permission is granted to make and distribute verbatim copies of this
manual provided the copyright notice and this permission notice are
preserved on all copies.

   Permission is granted to copy and distribute modified versions of
this manual under the conditions for verbatim copying, provided that
the entire resulting derived work is distributed under the terms of a
permission notice identical to this one.

   Permission is granted to copy and distribute translations of this
manual into another language, under the above conditions for modified
versions.


File: octave.info,  Node: Rearranging Matrices,  Prev: Finding Elements and Checking Conditions,  Up: Matrix Manipulation

Rearranging Matrices
====================

   The function `fliplr' reverses the order of the columns in a matrix,
and `flipud' reverses the order of the rows.  For example,

     octave:13> fliplr ([1, 2; 3, 4])
     ans =
     
       2  1
       4  3
     
     octave:13> flipud ([1, 2; 3, 4])
     ans =
     
       3  4
       1  2

   The function `rot90 (A, N)' rotates a matrix 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 N rotate the matrix in a clockwise direction.
For example,

     rot90 ([1, 2; 3, 4], -1)
     ans =
     
       3  1
       4  2

rotates the given matrix clockwise by 90 degrees.  The following are all
equivalent statements:

     rot90 ([1, 2; 3, 4], -1)
     rot90 ([1, 2; 3, 4], 3)
     rot90 ([1, 2; 3, 4], 7)

   The function `reshape (A, M, N)' returns a matrix with M rows and N
columns whose elements are taken from the matrix 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,

     octave:13> reshape ([1, 2, 3, 4], 2, 2)
     ans =
     
       1  3
       2  4

   If the variable `do_fortran_indexing' is `"true"', the `reshape'
function is equivalent to

     retval = zeros (m, n);
     retval (:) = a;

but it is somewhat less cryptic to use `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.

   The function `sort' can be used to arrange the elements of a vector
in increasing order.  For matrices, `sort' orders the elements in each
column.

   For example,

     octave:13> sort (rand (4))
     ans =
     
       0.065359  0.039391  0.376076  0.384298
       0.111486  0.140872  0.418035  0.824459
       0.269991  0.274446  0.421374  0.938918
       0.580030  0.975784  0.562145  0.954964

   The `sort' function may also be used to produce a matrix containing
the original row indices of the elements in the sorted matrix.  For
example,

     s =
     
       0.051724  0.485904  0.253614  0.348008
       0.391608  0.526686  0.536952  0.600317
       0.733534  0.545522  0.691719  0.636974
       0.986353  0.976130  0.868598  0.713884
     
     i =
     
       2  4  2  3
       4  1  3  4
       1  2  4  1
       3  3  1  2

These values may be used to recover the original matrix from the sorted
version.  For example,


   The `sort' function does not allow sort keys to be specified, so it
can't be used to order the rows of a matrix according to the values of
the elements in various columns(1) 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 third column.

     octave:13> a = rand (4)
     a =
     
       0.080606  0.453558  0.835597  0.437013
       0.277233  0.625541  0.447317  0.952203
       0.569785  0.528797  0.319433  0.747698
       0.385467  0.124427  0.883673  0.226632
     
     octave:14> [s, i] = sort (a (:, 3));
     octave:15> a (i, :)
     ans =
     
       0.569785  0.528797  0.319433  0.747698
       0.277233  0.625541  0.447317  0.952203
       0.080606  0.453558  0.835597  0.437013
       0.385467  0.124427  0.883673  0.226632

   The functions `triu (A, K)' and `tril (A, K)' extract the upper or
lower triangular part of the matrix A, and set 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 K is zero, so that `triu' and `tril' normally
include the main diagonal as part of the result matrix.

   If the value of K is negative, additional elements above (for
`tril') or below (for `triu') the main diagonal are also selected.

   The absolute value of K must not be greater than the number of sub-
or super-diagonals.

   For example,
     octave:13> tril (rand (4), 1)
     ans =
     
       0.00000  0.00000  0.00000  0.00000
       0.09012  0.00000  0.00000  0.00000
       0.01215  0.34768  0.00000  0.00000
       0.00302  0.69518  0.91940  0.00000

forms a lower triangular matrix from a random 4 by 4 matrix, omitting
the main diagonal, and

     octave:13> tril (rand (4), -1)
     ans =
     
       0.06170  0.51396  0.00000  0.00000
       0.96199  0.11986  0.35714  0.00000
       0.16185  0.61442  0.79343  0.52029
       0.68016  0.48835  0.63609  0.72113

forms a lower triangular matrix from a random 4 by 4 matrix, including
the main diagonal and the first super-diagonal.

   ---------- Footnotes ----------

   (1)  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.


File: octave.info,  Node: String Functions,  Next: System Utilities,  Prev: Matrix Manipulation,  Up: Top

String Functions
****************

   Octave currently has a limited ability to work with strings.

   The function `strcmp (S1, S2)' compares two strings, returning 1 if
they are the same, and 0 otherwise.

   *Note: For compatibility with MATLAB, Octave's strcmp function
returns 1 if the strings are equal, and 0 otherwise.  This is just the
opposite of the corresponding C library function.*

   The functions `int2str' and `num2str' convert a numeric argument to
a string.  These functions are not very flexible, but are provided for
compatibility with MATLAB.  For better control over the results, use
`sprintf' (*note Formatted Output::.).

   The function `setstr' can be used to convert a vector to a string.
Each element of the vector is converted to the corresponding ASCII
character.  For example,

     setstr ([97, 98, 99])

creates the string

     abc

   The function `undo_string_escapes (STRING)' converts special
characters in strings back to their escaped forms.  For example, the
expression

     bell = "\a";

assigns the value of the alert character (control-g, ASCII code 7) to
the string variable BELL.  If this string is printed, the system will
ring the terminal bell (if it is possible).  This is normally the
desired outcome.  However, sometimes it is useful to be able to print
the original representation of the string, with the special characters
replaced by their escape sequences.  For example,

     octave:13> undo_string_escapes (bell)
     ans = \a

replaces the unprintable alert character with its printable
representation.  *Note String Constants::, for a description of string
escapes.


File: octave.info,  Node: System Utilities,  Next: Command History Functions,  Prev: String Functions,  Up: Top

System Utilities
****************

   This chapter describes the functions that are available to allow you
to get information about what is happening outside of Octave, while it
is still running, and use this information in your program.  For
example, you can get information about environment variables, the
current time, and even start other programs from the Octave prompt.

* Menu:

* Timing Utilities::
* Interacting with the OS::
* System Information::
* Other Functions::


File: octave.info,  Node: Timing Utilities,  Next: Interacting with the OS,  Prev: System Utilities,  Up: System Utilities

Timing Utilities
================

   The function `clock' returns a vector containing the current year,
month (1-12), day (1-31), hour (0-23), minute (0-59) and second (0-60).
For example,

     octave:13> clock
     ans =
     
       1993     8    20     4    56     1

   The function clock is more accurate on systems that have the
`gettimeofday' function.

   To get the date as a character string in the form DD-MMM-YY, use the
command `date'.  For example,

     octave:13> date
     ans = 20-Aug-93

   Octave also has functions for computing time intervals and CPU time
used.  The functions `tic' and `toc' can be used to set and check a
wall-clock timer.  For example,

     tic ();
     # many computations later...
     elapsed_time = toc ();

will set the variable `elapsed_time' to the number of seconds since the
most recent call to the function `tic'.

   The function `etime' provides another way to get elapsed wall-clock
time by returning the difference (in seconds) between two time values
returned from `clock'.  For example:

     t0 = clock ();
     # many computations later...
     elapsed_time = etime (clock (), t0);

will set the variable `elapsed_time' to the number of seconds since the
variable `t0' was set.

   The function `cputime' allows you to obtain information about the
amount of CPU time your Octave session is using.  For example,

     [total, user, system] = cputime ();

returns the CPU time used by your Octave session.  The first output is
the total time spent executing your process and is equal to the sum of
second and third outputs, which are the number of CPU seconds spent
executing in user mode and the number of CPU seconds spent executing in
system mode, respectively.

   Finally, Octave's function `is_leap_year' returns 1 if the given
year is a leap year and 0 otherwise.  If no arguments are provided,
`is_leap_year' will use the current year.  For example,

     octave:13> is_leap_year (2000)
     ans = 1

Contrary to what many people who post misinformation to Usenet
apparently believe, Octave knows that the year 2000 will be a leap year.


File: octave.info,  Node: Interacting with the OS,  Next: System Information,  Prev: Timing Utilities,  Up: System Utilities

Interacting with the OS
=======================

   You can execute any shell command using the function `system (CMD,
FLAG)'.  The second argument is optional.  If it is present, the output
of the command is returned by `system' as a string.  If it is not
supplied, any output from the command is printed, with the standard
output filtered through the pager.  For example,

     users = system ("finger", 1)

places the output of the command `finger' in the variable `users'.

   If you want to execute a shell command and have it behave as if it
were typed directly from the shell prompt, you may need to specify extra
arguments for the command.  For example, to get `bash' to behave as an
interactive shell, you can type

     system ("bash -i >/dev/tty");

   The first argument, `-i', tells `bash' to behave as an interactive
shell, and the redirection of the standard output stream prevents any
output produced by `bash' from being sent back to Octave, where it
would be buffered until Octave displays another prompt.

   The `system' function can return two values.  The first is any
output from the command that was written to the standard output stream,
and the second is the output status of the command.  For example,

     [output, status] = system ("echo foo; exit 2");

will set the variable `output' to the string `foo', and the variable
`status' to the integer `2'.

   The name `shell_cmd' exists for compatibility with earlier versions
of Octave.

   You can find the values of environment variables using the function
`getenv'.  For example,

     getenv ("PATH")

returns a string containing the value of your path.

   The functions `clc', and `home' clear your terminal screen and move
the cursor to the upper left corner.

   You can change the current working directory using the `cd' command.
Tilde expansion is performed on the path.  For example,

     cd ~/octave

Changes the current working directory to `~/octave'.  If the directory
does not exist, an error message is printed and the working directory
is not changed.

   The name `chdir' is an alias for `cd'.

   The command `pwd' prints the current working directory.

   The functions `dir' and `ls' list directory contents.  For example,

     octave:13> ls -l
     total 12
     -rw-r--r--   1 jwe      users        4488 Aug 19 04:02 foo.m
     -rw-r--r--   1 jwe      users        1315 Aug 17 23:14 bar.m

   The `dir' and `ls' commands are implemented by calling your system's
directory listing command, so the available options may vary from
system to system.


File: octave.info,  Node: System Information,  Next: Other Functions,  Prev: Interacting with the OS,  Up: System Utilities

System Information
==================

   If possible, `computer' prints a string of the form CPU-VENDOR-OS
that identifies the kind of computer Octave is running on.  For example,

     octave:13> computer
     sparc-sun-sunos4.1.2

   The function `isieee' returns 1 if your computer claims to conform
to the IEEE standard for floating point calculations.

   The function `version' returns Octave's version number as a string.
This is also the value of the built-in variable `OCTAVE_VERSION'.
*Note Built-in Variables::.


File: octave.info,  Node: Other Functions,  Prev: System Information,  Up: System Utilities

Other Functions
===============

   The function `pause' allows you to suspend the execution of a
program.  If invoked without any arguments, Octave waits until you type
a character.  With a numeric argument, it pauses for the given number of
seconds.  For example, the following statement prints a message and then
waits 5 seconds before clearing the screen.

     fprintf (stderr, "wait please...\n"), pause (5), clc


File: octave.info,  Node: Command History Functions,  Next: Help,  Prev: System Utilities,  Up: Top

Command History Functions
*************************

   Octave provides three functions for viewing, editing, and re-running
chunks of commands from the history list.

   The function `history' displays a list of commands that you have
executed.  It also allows you to write the current history to a file for
safe keeping, and to replace the history list with the commands stored
in a named file.  Valid arguments are:

`-w file'
     Write the current history to the named file.  If the name is
     omitted, use the default history file (normally `~/.octave_hist').

`-r file'
     Read the named file, replacing the current history list with its
     contents.  If the name is omitted, use the default history file
     (normally `~/.octave_hist').

`N'
     Only display the most recent `N' lines of history.

`-q'
     Don't number the displayed lines of history.  This is useful for
     cutting and pasting commands if you are using the X Window System.

   For example, to display the five most recent commands that you have
typed without displaying line numbers, use the command `history -q 5'.

   The function `edit_history' allows you to edit a block of commands
from the history list using the editor named by the environment
variable `EDITOR', or the default editor (normally `vi').  It is often
more convenient to use `edit_history' to define functions rather than
attempting to enter them directly on the command line.  By default, the
block of commands is executed as soon as you exit the editor.  To avoid
executing any commands, simply delete all the lines from the buffer
before exiting the editor.

   The `edit_history' command takes two optional arguments specifying
the history numbers of first and last commands to edit.  For example,
the command

     edit_history 13

extracts all the commands from the 13th through the last in the history
list.  The command

     edit_history 13 169

only extracts commands 13 through 169.  Specifying a larger number for
the first command than the last command reverses the list of commands
before placing them in the buffer to be edited.  If both arguments are
omitted, the previous command in the history list is used.

   The command `run_history' is like `edit_history', except that the
editor is not invoked, and the commands are simply executed as they
appear in the history list.

   The `diary' command allows you to create a list of all commands
*and* the output they produce, mixed together just as you see them on
your terminal.

   For example, the command

     diary on

tells Octave to start recording your session in a file called `diary'
in your current working directory.  To give Octave the name of the file
write to, use the a command like

     diary my-diary.txt

Then Octave will write all of your commands to the file `my-diary.txt'.

   To stop recording your session, use the command

     diary off

Without any arguments, `diary' toggles the current diary state.


File: octave.info,  Node: Help,  Next: Programming Utilities,  Prev: Command History Functions,  Up: Top

Help
****

   Octave's `help' command can be used to print brief usage-style
messages, or to display information directly from an on-line version of
the printed manual, using the GNU Info browser.  If invoked without any
arguments, `help' prints a list of all the available operators,
functions, and built-in variables.  If the first argument is `-i', the
`help' command searches the index of the on-line version of this manual
for the given topics.

   For example, the command

     help help

prints a short message describing the `help' command, and

     help -i help

starts the GNU Info browser at this node in the on-line version of the
manual.

   *Note Using Info::, for complete details about how to use the GNU
Info browser to read the on-line version of the manual.


File: octave.info,  Node: Programming Utilities,  Next: Amusements,  Prev: Help,  Up: Top

Programming Utilities
*********************

* Menu:

* Evaluating Strings as Commands::
* Miscellaneous Utilities::


File: octave.info,  Node: Evaluating Strings as Commands,  Next: Miscellaneous Utilities,  Prev: Programming Utilities,  Up: Programming Utilities

Evaluating Strings as Commands
==============================

   It is often useful to evaluate a string as if it were an Octave
program, or use a string as the name of a function to call.  These
functions are necessary in order to evaluate commands that are not
known until run time, or to write functions that will need to call
user-supplied functions.

   The function `eval (COMMAND)' parses COMMAND and evaluates it as if
it were an Octave program, returning the last value computed.  The
COMMAND is evaluated in the current context, so any results remain
available after `eval' returns.  For example,

     octave:13> a
     error: `a' undefined
     octave:14> eval ("a = 13")
     a = 13
     ans = 13
     octave:15> a
     a = 13

   In this case, two values are printed:  one for the expression that
was evaluated, and one for the value returned from `eval'.  Just as
with any other expression, you can turn printing off by ending the
expression in a semicolon.  For example,

     octave:13> a
     error: `a' undefined
     octave:14> eval ("a = 13;")
     ans = 13
     octave:15> a
     a = 13

   The function `feval (NAME, ...)' can be used to evaluate the
function named NAME.  Any arguments after the first are passed on to
the named function.  For example,

     octave:12> feval ("acos", -1)
     ans = 3.1416

calls the function `acos' with the argument `-1'.

   The function `feval' is necessary in order to be able to write
functions that call user-supplied functions, because Octave does not
have a way to declare a pointer to a function (like C) or to declare a
special kind of variable that can be used to hold the name of a function
(like `EXTERNAL' in Fortran).  Instead, you must refer to functions by
name, and use `feval' to call them.

   For example, here is a simple-minded function for finding the root
of a function of one variable:

     function result = newtroot (fname, x)
     
     # usage: newtroot (fname, x)
     #
     #   fname : a string naming a function f(x).
     #   x     : initial guess
     
       delta = tol = sqrt (eps);
       maxit = 200;
       fx = feval (fname, x);
       for i = 1:maxit
         if (abs (fx) < tol)
           result = x;
           return;
         else
           fx_new = feval (fname, x + delta);
           deriv = (fx_new - fx) / delta;
           x = x - fx / deriv;
           fx = fx_new;
         endif
       endfor
     
       result = x;
     
     endfunction

   Note that this is only meant to be an example of calling
user-supplied functions and should not be taken too seriously.  In
addition to using a more robust algorithm, any serious code would check
the number and type of all the arguments, ensure that the supplied
function really was a function, etc.


File: octave.info,  Node: Miscellaneous Utilities,  Prev: Evaluating Strings as Commands,  Up: Programming Utilities

Miscellaneous Utilities
=======================

   The following functions allow you to determine the size of a
variable or expression, find out whether a variable exists, print error
messages, or delete variable names from the symbol table.

`columns (A)'
     Return the number of columns of A.

`rows (A)'
     Return the number of rows of A.

`length (A)'
     Return the number of rows of A or the number of columns of A,
     whichever is larger.

`size (A [, N])'
     Return the number rows and columns of A.

     With one input argument and one output argument, the result is
     returned in a 2 element row vector.  If there are two output
     arguments, the number of rows is assigned to the first, and the
     number of columns to the second.  For example,

          octave:13> size ([1, 2; 3, 4; 5, 6])
          ans =
          
            3  2
          
          octave:14> [nr, nc] = size ([1, 2; 3, 4; 5, 6])
          nr = 3
          
          nc = 2

     If given a second argument of either 1 or 2, `size' will return
     only the row or column dimension.  For example

          octave:15> size ([1, 2; 3, 4; 5, 6], 2)
          ans = 2

     returns the number of columns in the given matrix.

`is_global (A)'
     Return 1 if A is globally visible.  Otherwise, return 0.

`is_matrix (A)'
     Return 1 if A is a matrix.  Otherwise, return 0.

`is_vector (A)'
     Return 1 if A is a vector.  Otherwise, return 0.

`is_scalar (A)'
     Return 1 if A is a scalar.  Otherwise, return 0.

`is_square (X)'
     If X is a square matrix, then return the dimension of X.
     Otherwise, return 0.

`is_symmetric (X, TOL)'
     If X is symmetric within the tolerance specified by TOL, then
     return the dimension of X.  Otherwise, return 0.  If TOL is
     omitted, use a tolerance equal to the machine precision.

`isstr (A)'
     Return 1 if A is a string.  Otherwise, return 0.

`isempty (A)'
     Return 1 if A is an empty matrix (either the number of rows, or
     the number of columns, or both are zero).  Otherwise, return 0.

`clear PATTERN ...'
     Delete the names matching the given patterns from the symbol
     table.  The pattern may contain the following special characters:
    `?'
          Match any single character.

    `*'
          Match zero or more characters.

    `[ LIST ]'
          Match the list of characters specified by LIST.  If the first
          character is `!' or `^', match all characters except those
          specified by LIST.  For example, the pattern `[a-zA-Z]' will
          match all lower and upper case alphabetic characters.

     For example, the command

          clear foo b*r

     clears the name `foo' and all names that begin with the letter `b'
     and end with the letter `r'.

     If `clear' is called without any arguments, all user-defined
     variables (local and global) are cleared from the symbol table.  If
     `clear' is called with at least one argument, only the visible
     names matching the arguments are cleared.  For example, suppose
     you have defined a function `foo', and then hidden it by
     performing the assignment `foo = 2'.  Executing the command `clear
     foo' once will clear the variable definition and restore the
     definition of `foo' as a function.  Executing `clear foo' a second
     time will clear the function definition.

     This command may not be used within a function body.

`who OPTIONS PATTERN ...'
     List currently defined symbols matching the given patterns.  The
     following are valid options.  They may be shortened to one
     character but may not be combined.

    `-all'
          List all currently defined symbols.

    `-builtins'
          List built-in variables and functions.  This includes all
          currently compiled function files, but does not include all
          function files that are in the `LOADPATH'.

    `-functions'
          List user-defined functions.

    `-long'
          Print a long listing including the type and dimensions of any
          symbols.  The symbols in the first column of output indicate
          whether it is possible to redefine the symbol, and whether it
          is possible for it to be cleared.

    `-variables'
          List user-defined variables.

     Valid patterns are the same as described for the `clear' command
     above.  If no patterns are supplied, all symbols from the given
     category are listed.  By default, only user defined functions and
     variables visible in the local scope are displayed.

     The command `whos' is equivalent to `who -long'.

`exist (NAME)'
     Return 1 if the name exists as a variable, and 2 if the name (after
     appending `.m') is a function file in the path.  Otherwise, return
     0.

`error (MSG)'
     Print the message MSG, prefixed by the string `error: ', and set
     Octave's internal error state such that control will return to the
     top level without evaluating any more commands.  This is useful for
     aborting from functions.

     If MSG does not end with a new line character, Octave will print a
     traceback of all the function calls leading to the error.  For
     example,

          function f () g () end
          function g () h () end
          function h () nargin == 1 || error ("nargin != 1"); end
          f ()
          error: nargin != 1
          error: evaluating index expression near line 1, column 30
          error: evaluating binary operator `||' near line 1, column 27
          error: called from `h'
          error: called from `g'
          error: called from `f'

     produces a list of messages that can help you to quickly locate the
     exact location of the error.

     If MSG ends in a new line character, Octave will only print MSG
     and will not display any traceback messages as it returns control
     to the top level.  For example, modifying the error message in the
     previous example to end in a new line causes Octave to only print
     a single message:

          function h () nargin == 1 || error ("nargin != 1\n"); end
          f ()
          error: nargin != 1

`warning (MSG)'
     Print the message MSG prefixed by the string `warning: '.

`usage (MSG)'
     Print the message MSG, prefixed by the string `usage: ', and set
     Octave's internal error state such that control will return to the
     top level without evaluating any more commands.  This is useful for
     aborting from functions.

     After `usage' is evaluated, Octave will print a traceback of all
     the function calls leading to the usage message.

`perror (NAME, NUM)'
     Print the error message for function NAME corresponding to the
     error number NUM.  This function is intended to be used to print
     useful error messages for those functions that return numeric error
     codes.

`menu (TITLE, OPT1, ...)'
     Print a title string followed by a series of options.  Each option
     will be printed along with a number.  The return value is the
     number of the option selected by the user.  This function is
     useful for interactive programs.  There is no limit to the number
     of options that may be passed in, but it may be confusing to
     present more than will fit easily on one screen.

`document SYMBOL TEXT'
     Set the documentation string for SYMBOL to TEXT.

`file_in_path (PATH, FILE)'
     Return the absolute name name of FILE if it can be found in PATH.
     The value of PATH should be a colon-separated list of directories
     in the format described for the built-in variable `LOADPATH'.

     If the file cannot be found in the path, an empty matrix is
     returned.  For example,

          octave:13> file_in_path (LOADPATH, "nargchk.m")
          ans = /usr/local/lib/octave/1.1.0/m/general/nargchk.m

`nargchk (NARGIN_MIN, NARGIN_MAX, N)'
     If N is in the range NARGIN_MIN through NARGIN_MAX inclusive,
     return the empty matrix.  Otherwise, return a message indicating
     whether N is too large or too small.

     This is useful for checking to see that the number of arguments
     supplied to a function is within an acceptable range.

`octave_tmp_file_name'
     Return a unique temporary file name.

     Since the named file is not opened, by `octave_tmp_file_name', it
     is possible (though relatively unlikely) that it will not be
     available by the time your program attempts to open it.

`type NAME ...'
     Display the definition of each NAME that refers to a function.

     Currently, Octave can only display functions that can be compiled
     cleanly, because it uses its internal representation of the
     function to recreate the program text.

     Comments are not displayed because Octave's currently discards
     them as it converts the text of a function file to its internal
     representation.  This problem may be fixed in a future release.

`which NAME ...'
     Display the type of each NAME.  If NAME is defined from a function
     file, the full name of the file is also displayed.


File: octave.info,  Node: Amusements,  Next: Installation,  Prev: Programming Utilities,  Up: Top

Amusements
**********

   Octave cannot promise that you will actually win the lotto, but it
can pick your numbers for you.  The function `texas_lotto' will select
six numbers between 1 and 50.

   The function `list_primes (N)' uses a brute-force algorithm to
compute the first N primes.

   Other amusing functions include `casesen', `flops', `sombrero',
`exit', and `quit'.


File: octave.info,  Node: Installation,  Next: Trouble,  Prev: Amusements,  Up: Top

Installing Octave
*****************

   Here is the procedure for installing Octave from scratch on a Unix
system.  For instructions on how to install the binary distributions of
Octave, see *Note Binary Distributions::.

   * Run the shell script `configure'.  This will determine the features
     your system has (or doesn't have) and create a file named Makefile
     from each of the files named Makefile.in.

     Here is a summary of the configure options that are most
     frequently used when building Octave:

    `--prefix=PREFIX'
          Install Octave in subdirectories below PREFIX.  The default
          value of PREFIX is `/usr/local'.

    `--srcdir=DIR'
          Look for Octave sources in the directory DIR.

    `--with-f2c'
          Use f2c even if Fortran compiler is available.

    `--enable-dld'
          Use DLD to make Octave capable of dynamically linking
          externally compiled functions.  This only works on systems
          that have a working port of DLD.

    `--enable-lite-kernel'
          Compile smaller kernel.  This currently requires DLD so that
          Octave can load functions at run time that are not loaded at
          compile time.

    `--help'
          Print a summary of the options recognized by the configure
          script.

     See the file INSTALL for more information about the command line
     options used by configure.  That file also contains instructions
     for compiling in a directory other than where the source is
     located.

   * Run make.

     You will need a recent version of GNU make.  Modifying Octave's
     Makefiles to work with other make programs is probably not worth
     your time.  We recommend you get and compile GNU make instead.

     For plotting, you will need to have gnuplot installed on your
     system.  Gnuplot is a command-driven interactive function plotting
     program.  Gnuplot is copyrighted, but freely distributable.  The
     `gnu' in gnuplot is a coincidence--it is not related to the GNU
     project or the FSF in any but the most peripheral sense.

     For version 1.1.1, you must have the GNU C++ compiler (gcc)
     version 2.6.3 or later to compile Octave.  You will also need
     version 2.6.1 of the GNU C++ class library (libg++).  If you plan
     to modify the parser you will also need GNU bison and fles.  If
     you modify the documentation, you will need GNU Texinfo, along
     with the patch for the makeinfo program that is distributed with
     Octave.

     GNU make, gcc, and libg++, gnuplot, bison, flex, and Texinfo are
     all available from many anonymous ftp archives, including
     ftp.che.utexas.edu, ftp.uu.net, prep.ai.mit.edu, and
     wuarchive.wustl.edu.

     If you don't have a Fortran compiler, or if your Fortran compiler
     doesn't work like the traditional Unix f77, you will need to have
     the Fortran to C translator f2c.  You can get f2c from any number
     of anonymous ftp archives.  The most recent version of f2c is
     always available from research.att.com.

     On an otherwise idle SPARCstation II, it will take somewhere
     between 60 and 90 minutes to compile everything, depending on
     whether you are compiling the Fortran libraries with f2c or using
     the Fortran compiler directly.  You will need about 50 megabytes
     of disk storage to work with (considerably less if you don't
     compile with debugging symbols).  To do that, use the command

          make CFLAGS=-O CXXFLAGS=-O LDFLAGS=

     instead of just `make'.

   * If you encounter errors while compiling Octave, first check the
     list of known problems below to see if there is a workaround or
     solution for your problem.  If not, see *Note Trouble::, for
     information about how to report bugs.

   * Once you have successfully compiled Octave, run `make install'.

     This will install a copy of octave, its libraries, and its
     documentation in the destination directory.  As distributed,
     Octave is installed in the following directories:

    `PREFIX/bin'
          Octave and other binaries that people will want to run
          directly.

    `PREFIX/lib'
          Libraries like libcruft.a and liboctave.a.

    `PREFIX/include/octave'
          Include files distributed with Octave.

    `PREFIX/man/man1'
          Unix-style man pages describing Octave.

    `PREFIX/info'
          Info files describing Octave.

    `PREFIX/lib/octave/VERSION/m'
          Function files distributed with Octave.  This includes the
          Octave version, so that multiple versions of Octave may be
          installed at the same time.

    `PREFIX/lib/octave/VERSION/exec/HOST_TYPE'
          Executables to be run by Octave rather than the user.

    `PREFIX/lib/octave/VERSION/oct/HOST_TYPE'
          Object files that will be dynamically loaded.

    `PREFIX/lib/octave/VERSION/imagelib'
          Image files that are distributed with Octave.

     where PREFIX defaults to `/usr/local', VERSION stands for the
     current version number of the interpreter, and HOST_TYPE is the
     type of computer on which Octave is installed (for example,
     `i486-unknown-gnu').

* Menu:

* Installation Problems::
* Binary Distributions::


File: octave.info,  Node: Installation Problems,  Next: Binary Distributions,  Prev: Installation,  Up: Installation

Installation Problems
=====================

   This section contains a list of problems (and some apparent problems
that don't really mean anything is wrong) that may show up during
installation of Octave.

   * On AIX (and possibly other) systems, GCC 2.6.2 generates invalid
     assembly code when compiling some parts of Octave.  On AIX
     systems, it is possible to get a working binary by not using the
     compiler flag `-fno-implicit-templates'.  You can specify this as
     an option to make by using a command like

          make NO_IMPLICIT_TEMPLATES=

   * You may need to edit some files in the gcc include subdirectory to
     add prototypes for functions there.  For example, Ultrix 4.2 needs
     proper declarations for the `signal()' and the `SIG_IGN' macro in
     the file `signal.h'.

     On some systems the `SIG_IGN' macro is defined to be something like
     this:

          #define  SIG_IGN  (void (*)())1

     when it should really be something like:

          #define  SIG_IGN  (void (*)(int))1

     to match the prototype declaration for `signal()'.

     The gcc fixincludes/fixproto script should probably fix this when
     gcc installs its modified set of header files, but I don't think
     that's been done yet.

   * There is a bug with the makeinfo program that is distributed with
     texinfo-3.1 that causes the indices in Octave's on-line manual to
     be generated incorrectly.  If you need to recreate the on-line
     documentation, you should get the makeinfo program that is
     distributed with texinfo-3.1 and apply the patch for makeinfo that
     is distributed with Octave.  See the file MAKEINFO.PATCH for more
     details.

   * If you don't have NPSOL but you still want to be able to solve
     NLPs, or if you don't have QPSOL but you still want to solve QPs,
     you'll need to find replacements or order them from Stanford.  If
     you know of a freely redistributable replacement, please let us
     know--we might be interested in distributing it with Octave.

     You can get more information about NPSOL and QPSOL from

          Stanford University
          Office of Technology Licensing
          857 Serra Street
          Stanford CA 94305-6225
          Tel: (415) 723-0651
          Fax: (415) 725-7295

     Octave may soon support FSQP, an NLP solver from Andre Tits
     (andre@src.umd.edu) of the University of Maryland.  FSQP is
     available free of charge to academic sites, but can not be
     redistributed to third parties.

   * Some of the Fortran subroutines may fail to compile with older
     versions of the Sun Fortran compiler.  If you get errors like

          zgemm.f:
          	zgemm:
          warning: unexpected parent of complex expression subtree
          zgemm.f, line 245: warning: unexpected parent of complex expression subtree
          warning: unexpected parent of complex expression subtree
          zgemm.f, line 304: warning: unexpected parent of complex expression subtree
          warning: unexpected parent of complex expression subtree
          zgemm.f, line 327: warning: unexpected parent of complex expression subtree
          pcc_binval: missing IR_CONV in complex op
          make[2]: *** [zgemm.o] Error 1

     when compiling the Fortran subroutines in the `libcruft'
     subdirectory, you should either upgrade your compiler or try
     compiling with optimization turned off.

   * On NeXT systems, if you get errors like this:

          /usr/tmp/cc007458.s:unknown:Undefined local symbol LBB7656
          /usr/tmp/cc007458.s:unknown:Undefined local symbol LBE7656

     when compiling `Array.cc' and `Matrix.cc', try recompiling these
     files without `-g'.

   * Some people have reported that calls to shell_cmd and the pager do
     not work on SunOS systems.  This is apparently due to having
     `G_HAVE_SYS_WAIT' defined to be 0 instead of 1 when compiling
     libg++.

   * On NeXT systems, linking to `libsys_s.a' may fail to resolve the
     following functions

          _tcgetattr
          _tcsetattr
          _tcflow

     which are part of `libposix.a'.  Unfortunately, linking Octave with
     `-posix' results in the following undefined symbols.

          .destructors_used
          .constructors_used
          _objc_msgSend
          _NXGetDefaultValue
          _NXRegisterDefaults
          .objc_class_name_NXStringTable
          .objc_class_name_NXBundle

     One kludge around this problem is to extract `termios.o' from
     `libposix.a', put it in Octave's `src' directory, and add it to
     the list of files to link together in the Makefile.  Suggestions
     for better ways to solve this problem are welcome!

   * With g++ 2.6.3 (and possibly other 2.6.x versions) on some Intel
     x86 systems, compiling `Array-d.cc' fails with the messages like

          as: /tmp/cc005254.s:4057: Local symbol LBB103 never defined.
          as: /tmp/cc005254.s:4057: Local symbol LBE103 never defined.

     A possible workaround for this is to compile without `-g'.

   * If Octave crashes immediately with a floating point exception, it
     is likely that it is failing to initialize the IEEE floating point
     values for infinity and NaN.

     If your system actually does support IEEE arithmetic, you should
     be able to fix this problem by modifying the function
     `octave_ieee_init' in the file `sysdep.cc' to correctly initialize
     Octave's internal infinity and NaN variables.

     If your system does not support IEEE arithmetic but Octave's
     configure script incorrectly determined that it does, you can work
     around the problem by editing the file `config.h' to not define
     `HAVE_ISINF', `HAVE_FINITE', and `HAVE_ISNAN'.

     In any case, please report this as a bug since it might be
     possible to modify Octave's configuration script to automatically
     determine the proper thing to do.


File: octave.info,  Node: Binary Distributions,  Prev: Installation Problems,  Up: Installation

Binary Distributions
====================

   This section contains instructions for creating and installing a
binary distribution.

* Menu:

* Installing Octave from a Binary Distribution::
* Creating a Binary Distribution::


File: octave.info,  Node: Installing Octave from a Binary Distribution,  Next: Creating a Binary Distribution,  Prev: Binary Distributions,  Up: Binary Distributions

Installing Octave from a Binary Distribution
--------------------------------------------

   * To install Octave from a binary distribution, execute the command

          sh ./doinstall.sh

     in the top level directory of the distribution.

     Binary distributions are normally compiled assuming that Octave
     will be installed in the following subdirectories of `/usr/local'.

    `bin'
          Octave and other binaries that people will want to run
          directly.

    `man/man1'
          Unix-style man pages describing Octave.

    `info'
          Info files describing Octave.

    `lib/octave/VERSION/m'
          Function files distributed with Octave.  This includes the
          Octave version, so that multiple versions of Octave may be
          installed at the same time.

    `lib/octave/VERSION/exec/HOST_TYPE'
          Executables to be run by Octave rather than the user.

    `lib/octave/VERSION/imagelib'
          Image files that are distributed with Octave.

     where VERSION stands for the current version number of the
     interpreter, and HOST_TYPE is the type of computer on which Octave
     is installed (for example, `i486-unknown-gnu').

     If these directories don't exist, the script `doinstall.sh' will
     create them for you.

     If this is possible for you to install Octave in `/usr/local', or
     if you would prefer to install it in a different directory, you can
     specify the name of the top level directory as an argument to the
     doinstall.sh script.  For example:

          sh ./doinstall.sh /some/other/directory

     Octave will then be installed in subdirectories of the directory
     `/some/other/directory'


File: octave.info,  Node: Creating a Binary Distribution,  Prev: Installing Octave from a Binary Distribution,  Up: Binary Distributions

Creating a Binary Distribution
------------------------------

   Here is how to build a binary distribution for others.

   * Build Octave in the same directory as the source.  This is required
     since the `binary-dist' targets in the Makefiles will not work if
     you compile outside the source tree.

   * Use `CFLAGS=-O CXXFLAGS=-O LDFLAGS=' as arguments for Make because
     most people who get the binary distributions are probably not
     going to be interested in debugging Octave.

   * Type `make binary-dist'.  This will build everything and then pack
     it up for distribution.


File: octave.info,  Node: Trouble,  Next: Command Line Editing,  Prev: Installation,  Up: Top

Known Causes of Trouble with Octave
***********************************

   This section describes known problems that affect users of Octave.
Most of these are not Octave bugs per se--if they were, we would fix
them.  But the result for a user may be like the result of a bug.

   Some of these problems are due to bugs in other software, some are
missing features that are too much work to add, and some are places
where people's opinions differ as to what is best.

* Menu:

* Actual Bugs::                 Bugs we will fix later.
* Reporting Bugs::
* Bug Criteria::
* Bug Lists::
* Bug Reporting::
* Sending Patches::
* Service::


File: octave.info,  Node: Actual Bugs,  Next: Reporting Bugs,  Prev: Trouble,  Up: Trouble

Actual Bugs We Haven't Fixed Yet
================================

   * Output that comes directly from Fortran functions is not sent
     through the pager and may appear out of sequence with other output
     that is sent through the pager.  One way to avoid this is to force
     pending output to be flushed before calling a function that will
     produce output from within Fortran functions.  To do this, use the
     command

          fflush (stdout)

     Another possible workaround is to use the command

          page_screen_output = "false"

     to turn the pager off.

   * Control-C doesn't work properly in the pager on DEC Alpha systems
     running OSF/1 3.0.

     This appears to be a bug in the OSF/1 3.0 Bourne shell.  The
     problem doesn't appear on systems running OSF/1 1.3.

   * If you get messages like

          Input line too long

     when trying to plot many lines on one graph, you have probably
     generated a plot command that is too larger for `gnuplot''s
     fixed-length buffer for commands.  Splitting up the plot command
     doesn't help because replot is implemented in gnuplot by simply
     appending the new plotting commands to the old command line and
     then evaluating it again.

     You can demonstrate this `feature' by running gnuplot and doing
     something like

            plot sin (x), sin (x), sin (x), ... lots more ..., sin (x)

     and then

            replot sin (x), sin (x), sin (x), ... lots more ..., sin (x)

     after repeating the replot command a few times, gnuplot will give
     you an error.

     Also, it doesn't help to use backslashes to enter a plot command
     over several lines, because the limit is on the overall command
     line length, once the backslashed lines are all pasted together.

     Because of this, Octave tries to use as little of the command-line
     length as possible by using the shortest possible abbreviations for
     all the plot commands and options.  Unfortunately, the length of
     the temporary file names is probably what is taking up the most
     space on the command line.

     You can buy a little bit of command line space by setting the
     environment variable `TMPDIR' to be "." before starting Octave, or
     you can increase the maximum command line length in gnuplot by
     changing the following limits in the file plot.h in the gnuplot
     distribution and recompiling gnuplot.

          #define MAX_LINE_LEN 32768  /* originally 1024 */
          #define MAX_TOKENS 8192     /* originally 400 */

     Of course, this doesn't really fix the problem, but it does make it
     much less likely that you will run into trouble unless you are
     putting a very large number of lines on a given plot.

   * String handling could use some work.

   A list of ideas for future enhancements is distributed with Octave.
See the file `PROJECTS' in the top level directory in the source
distribution.


File: octave.info,  Node: Reporting Bugs,  Next: Bug Criteria,  Prev: Actual Bugs,  Up: Trouble

Reporting Bugs
==============

   Your bug reports play an essential role in making Octave reliable.

   When you encounter a problem, the first thing to do is to see if it
is already known.  *Note Trouble::.  If it isn't known, then you should
report the problem.

   Reporting a bug may help you by bringing a solution to your problem,
or it may not.  In any case, the principal function of a bug report is
to help the entire community by making the next version of Octave work
better.  Bug reports are your contribution to the maintenance of Octave.

   In order for a bug report to serve its purpose, you must include the
information that makes it possible to fix the bug.

   If you have Octave working at all, the easiest way to prepare a
complete bug report is to use the Octave function `bug_report'.  When
you execute this function, Octave will prompt you for a subject and then
invoke the editor on a file that already contains all the configuration
information.  When you exit the editor, Octave will mail the bug report
for you.

* Menu:

* Bug Criteria::
* Where: Bug Lists.             Where to send your bug report.
* Reporting: Bug Reporting.     How to report a bug effectively.
* Patches: Sending Patches.     How to send a patch for Octave.

