Provided by: blt-dev_2.5.3+dfsg-7build1_amd64 bug

NAME

       vector -  Vector data type for Tcl

SYNOPSIS

       vector configure option value ...

       vector create vecName ?vecName...? ?switches?

       vector destroy vecName ?vecName...?

       vector expr expression

       vector names ?pattern...?

       vector op operation vecName ?arg?...
_________________________________________________________________

DESCRIPTION

       The vector command creates a vector of floating point values.  The vector's components can be manipulated
       in three ways: through a Tcl array variable, a Tcl command, or the C API.

INTRODUCTION

       A  vector  is  simply an ordered set of numbers.  The components of a vector are real numbers, indexed by
       counting numbers.

       Vectors are common data structures for many applications.  For example, a graph may use  two  vectors  to
       represent  the  X-Y  coordinates  of  the data plotted.  The graph will automatically be redrawn when the
       vectors are updated or changed. By using vectors, you can separate data analysis from the  graph  widget.
       This  makes  it easier, for example, to add data transformations, such as splines.  It's possible to plot
       the same data to in multiple graphs, where each graph presents a different view or scale of the data.

       You could try to use Tcl's associative arrays as vectors.  Tcl arrays are easy to use.   You  can  access
       individual  elements randomly by specifying the index, or the set the entire array by providing a list of
       index and value pairs for each element.  The disadvantages of associative arrays as vectors  lie  in  the
       fact they are implemented as hash tables.

       • There's  no  implied  ordering  to the associative arrays.  If you used vectors for plotting, you would
         want to insure the second component comes after the first, an so on.  This isn't possible since  arrays
         are  actually  hash tables.  For example, you can't get a range of values between two indices.  Nor can
         you sort an array.

       • Arrays consume lots of memory when the number of elements becomes large (tens of thousands).   This  is
         because each element's index and value are stored as strings in the hash table.

       • The  C  programming interface is unwieldy.  Normally with vectors, you would like to view the Tcl array
         as you do a C array, as an array of floats or doubles.  But with hash tables, you must convert both the
         index and value to and from decimal strings, just to access an element in the  array.   This  makes  it
         cumbersome to perform operations on the array as a whole.

       The  vector  command  tries  to overcome these disadvantages while still retaining the ease of use of Tcl
       arrays.  The vector command creates both a new Tcl command and associate array which are  linked  to  the
       vector  components.   You  can  randomly  access vector components though the elements of array.  Not all
       indices are generated for the array, so printing the array (using the parray procedure)  does  not  print
       out all the component values.  You can use the Tcl command to access the array as a whole.  You can copy,
       append,  or  sort vector using its command.  If you need greater performance, or customized behavior, you
       can write your own C code to manage vectors.

EXAMPLE

       You create vectors using the vector command and its create operation.

              # Create a new vector.
              vector create y(50)

       This creates a new vector named y.  It  has  fifty  components,  by  default,  initialized  to  0.0.   In
       addition,  both  a  Tcl  command  and  array variable, both named y, are created.  You can use either the
       command or variable to query or modify components of the vector.

              # Set the first value.
              set y(0) 9.25
              puts "y has [y length] components"

       The array y can be used to read or set individual  components  of  the  vector.   Vector  components  are
       indexed  from  zero.   The array index must be a number less than the number of components.  For example,
       it's an error if you try to set the 51st element of y.

              # This is an error. The vector only has 50 components.
              set y(50) 0.02

       You can also specify a range of indices using a colon (:) to separate the first and last indices  of  the
       range.

              # Set the first six components of y
              set y(0:5) 25.2

       If you don't include an index, then it will default to the first and/or last component of the vector.

              # Print out all the components of y
              puts "y = $y(:)"

       There  are special non-numeric indices.  The index end, specifies the last component of the vector.  It's
       an error to use this index if the vector is empty (length is zero).  The  index  ++end  can  be  used  to
       extend  the vector by one component and initialize it to a specific value.  You can't read from the array
       using this index, though.

              # Extend the vector by one component.
              set y(++end) 0.02

       The other special indices are min and max.  They return the current smallest and  largest  components  of
       the vector.

              # Print the bounds of the vector
              puts "min=$y(min) max=$y(max)"

       To  delete  components  from  a  vector,  simply  unset the corresponding array element. In the following
       example, the first component of y is deleted.  All the remaining components of y will be  moved  down  by
       one index as the length of the vector is reduced by one.

              # Delete the first component
              unset y(0)
              puts "new first element is $y(0)"

       The vector's Tcl command can also be used to query or set the vector.

              # Create and set the components of a new vector
              vector create x
              x set { 0.02 0.04 0.06 0.08 0.10 0.12 0.14 0.16 0.18 0.20 }

       Here  we've created a vector x without a initial length specification.  In this case, the length is zero.
       The set operation resets the vector, extending it and setting values for each new component.

       There are several operations for vectors.  The range operation lists the components of a  vector  between
       two indices.

              # List the components
              puts "x = [x range 0 end]"

       You  can  search  for a particular value using the search operation.  It returns a list of indices of the
       components with the same value.  If no component has the same value, it returns "".

              # Find the index of the biggest component
              set indices [x search $x(max)]

       Other operations copy, append, or sort vectors.  You can append vectors or new values  onto  an  existing
       vector with the append operation.

              # Append assorted vectors and values to x
              x append x2 x3 { 2.3 4.5 } x4

       The sort operation sorts the vector.  If any additional vectors are specified, they are rearranged in the
       same  order  as  the  vector.   For  example, you could use it to sort data points represented by x and y
       vectors.

              # Sort the data points
              x sort y

       The vector x is sorted while the components of y are rearranged so that the original x,y coordinate pairs
       are retained.

       The expr operation lets you perform arithmetic on vectors.  The result is stored in the vector.

              # Add the two vectors and a scalar
              x expr { x + y }
              x expr { x * 2 }

       When a vector is modified, resized, or deleted, it may trigger call-backs to notify the  clients  of  the
       vector.   For  example,  when  a  vector  used  in  the graph widget is updated, the vector automatically
       notifies the widget that it has changed.  The graph can then redrawn itself at the next idle  point.   By
       default,  the  notification  occurs  when Tk is next idle.  This way you can modify the vector many times
       without incurring the penalty of the graph redrawing  itself  for  each  change.   You  can  change  this
       behavior using the notify operation.

              # Make vector x notify after every change
              x notify always
                ...
              # Never notify
              x notify never
                ...
              # Force notification now
              x notify now

              # Set Tcl callback for update of Tktable widget .t.
              x notify callback {.t conf -padx [.t cget -padx]; .t reread}

       To delete a vector, use the vector delete command.  Both the vector and its corresponding Tcl command are
       destroyed.

              # Remove vector x
              vector destroy x

       The  psuedo  vector  last  can  be  used at the end of an expression to implement running totals.  During
       execution it resolves to the result from the previous vector element evaluation.

              vector create A(10)
              vector create B(10)
              vector create S(10)
              vector create T(10)
              S expr A+B
              T expr S+last; # Running total

SYNTAX

       Vectors are created using the vector create operation.  Th create operation can  be  invoked  in  one  of
       three forms:

       vector create vecName
              This creates a new vector vecName which initially has no components.

       vector create vecName(size)
              This  second  form  creates  a  new  vector  which  will  contain  size number of components.  The
              components will be indexed starting from zero (0). The default value for the components is 0.0.

       vector create vecName(rows,columns)
              This form allows creation of a matrix with the specified columns and rows*columns  elements.   See
              the matrix section for more details.

       vector create vecName(first:last)
              The  last  form  creates  a  new  vector of indexed first through last.  First and last can be any
              integer value so long as first is less than last.

       Vector names must start with a letter and consist of letters, digits, or underscores.

              # Error: must start with letter
              vector create 1abc

       You can automatically generate vector names using the "#auto" vector name.   The  create  operation  will
       generate a unique vector name.

              set vec [vector create #auto]
              puts "$vec has [$vec length] components"

   VECTOR INDICES
       Vectors  are indexed by integers.  You can access the individual vector components via its array variable
       or Tcl command.  The string representing the index can be an integer, a numeric expression, a range, or a
       special keyword.

       The index must lie within the current range of the vector, otherwise an an  error  message  is  returned.
       Normally  the  indices  of  a  vector are start from 0.  But you can use the offset operation to change a
       vector's indices on-the-fly.

              puts $vecName(0)
              vecName offset -5
              puts $vecName(-5)

       When matrix numcols is > 1, 2D indexes are supported using ROW,COL form.

              vecName matrix numcols 3
              puts vecName(0,2)

       You can also use numeric expressions as indices.  The result of the expression must be an integer value.

              set n 21
              set vecName($n+3) 50.2

       The following special non-numeric indices are available: min, max, end, and ++end.

              puts "min = $vecName($min)"
              set vecName(end) -1.2

       The indices min and max will return the minimum and maximum values of the vector.   Also  available  are:
       prod,   sum,  and  mean.   The index end returns the value of the last component in the vector.  he index
       end,0 returns the value of the last row in column 0 of the vector.  The index ++end is used to append new
       value onto the vector.  It automatically extends the vector by numcols and sets its value.

              # Append an new component to the end
              set vecName(++end) 3.2

       A range of indices can be indicated by a colon (:).

              # Set the first six components to 1.0
              set vecName(0:5) 1.0

       If no index is supplied the first or last component is assumed.

              # Print the values of all the components
              puts $vecName(:)

VECTOR OPERATIONS

       vector configure ? -flush bool -watchunset bool -oldcreate bool -maxsize int -novariable bool -nocommand
       bool?
              The configure operation sets the default options used  in  creating  vectors:  these  options  are
              global  to  the  interpreter.   The  -maxsize  option,  when  non-zero, limits creation size.  The
              -oldcreate enable the creation shortcut: vector vec1 vec2 ....  See the create command for details
              on the others.  By default, these are all disabled or zero.

       vector create vecName?(size)?... ?switches?
              The create operation creates a new vector vecName. The size may be an integer, a  START:END  range
              or  ROW,COL (see matrix).  This creates both a Tcl command and array variable called vecName.  The
              name vecName must be unique, so another Tcl command or array variable can not already exist in the
              current scope.  You may access the components of the vector using the  variable.  If you change  a
              value in the array, or unset an array element, the vector is updated to reflect the changes.  When
              the variable vecName is unset, the vector and its Tcl command are also destroyed.

              The vector has optional switches that affect how the vector is created. They are as follows:

              -variable varName
                     Specifies  the  name  of a Tcl variable to be mapped to the vector. If the variable already
                     exists, it is first deleted, then recreated.  If varName  is  the  empty  string,  then  no
                     variable  will  be  mapped.   You  can  always  map a variable back to the vector using the
                     vector's variable operation.

              -command cmdName
                     Maps a Tcl command to the vector. The vector can be accessed using cmdName and one  of  the
                     vector  instance  operations.  A Tcl command by that name cannot already exist.  If cmdName
                     is the empty string, no command mapping will be made.

              -watchunset boolean
                     Indicates that the vector should automatically delete itself  if  the  variable  associated
                     with  the  vector is unset.  By default, the vector will not be deleted.  This is different
                     from previous releases.  Set boolean to "true" to get the old behavior.

              -flush boolean
                     Indicates that the vector should automatically flush the  cached  variable  elements  which
                     unsets  all  the  elements  of  the  Tcl array variable associated with the vector, freeing
                     memory associated with the variable. This includes both the hash table and the  hash  keys.
                     The down side is that this effectively flushes the caching of vector elements in the array.
                     This  means  that  the  subsequent  reads  of  the  array  will require a decimal to string
                     conversion.  By default, flushing is disabled.

       vector destroy vecName ?vecName...?
              Destroy vectors.

       vector expr expression
              All binary operators take vectors as operands (remember that numbers are treated as  one-component
              vectors).The  exact  action of binary operators depends upon the length of the second operand.  If
              the second operand has only one component, then each  element  of  the  first  vector  operand  is
              computed  by that value.  For example, the expression "x * 2" multiples all elements of the vector
              x by 2.  If the second operand has more than one component, both operands must be the same length.
              Each pair of corresponding elements are computed.  So "x + y" adds the the first components  of  x
              and y together, the second, and so on.

              The valid operators are listed below, grouped in decreasing order of precedence:

              -  !                Unary minus and logical NOT.  The unary minus flips the sign of each component
                                  in  the vector.  The logical not operator returns a vector of whose values are
                                  0.0 or 1.0.  For each non-zero component 1.0 is returned, 0.0 otherwise.

              ^                   Exponentiation.

              *  /  %             Multiply, divide, remainder.

              +  -                Add and subtract.

              <<  >>              Left and right shift.  Circularly shifts the values of the vector

              <  >  <=  >=        Boolean less, greater, less than or equal, and greater than  or  equal.   Each
                                  operator returns a vector of ones and zeros.  If the condition is true, 1.0 is
                                  the component value, 0.0 otherwise.

              ==  !=              Boolean  equal  and  not  equal.   Each  operator returns a vector of ones and
                                  zeros.  If the condition is true, 1.0 is the component value, 0.0 otherwise.

              &&                  Logical AND.  Produces a 1 result if both operands are non-zero, 0 otherwise.

              ||                  Logical OR.  Produces a 0 result if both operands are zero, 1 otherwise.

              x?y:z               If-then-else, as in C.

              See the C manual for more details on the results produced by each operator.   All  of  the  binary
              operators group left-to-right within the same precedence level.

              Several mathematical functions are supported for vectors.  Each of the following functions invokes
              the  math  library function of the same name; see the manual entries for the library functions for
              details on what they do.  The operation is applied to all elements of  the  vector  returning  the
              results.    All  functions  take  a vector operand.  If no vector operand is used in the call, the
              current vector is assumed. eg.

                     vector create aVec
                     aVec seq 0 100
                     aVec expr {2*abs(aVec)-1}
                     aVec length 100
                     aVec expr {2*row()}
                     vector expr {2*row()} ; # ERROR!

                     acos        cos         hypot      sinh
                     asin        cosh        log        sqrt
                     atan        exp         log10      tan
                     ceil        floor       sin        tanh

              Additional functions are:

              abs       Returns the absolute value of each component.

              random    Returns a vector of non-negative values uniformly distributed between [0.0,  1.0)  using
                        drand48.   The  seed  comes  from the internal clock of the machine or may be set manual
                        with the srandom function.

              round     Rounds each component of the vector.

              srandom   Initializes the random number generator using srand48.  The high order 32-bits  are  set
                        using  the  integral  portion  of  the  first vector component. All other components are
                        ignored.  The low order 16-bits are set to an arbitrary value.

              The following functions return a single value.

              adev      Returns the average deviation (defined  as  the  sum  of  the  absolute  values  of  the
                        differences between component and the mean, divided by the length of the vector).

              kurtosis  Returns the degree of peakedness (fourth moment) of the vector.

              length    Returns the number of components in the vector.

              max       Returns the vector's maximum value.

              mean      Returns the mean value of the vector.

              median    Returns the median of the vector.

              min       Returns the vector's minimum value.

              q1        Returns the first quartile of the vector.

              q3        Returns the third quartile of the vector.

              prod      Returns the product of the components.

              sdev      Returns  the  standard  deviation  (defined  as  the square root of the variance) of the
                        vector.

              skew      Returns the skewness (or third moment) of the vector.  This characterizes the degree  of
                        asymmetry of the vector about the mean.

              sum       Returns the sum of the components.

              var       Returns  the  variance  of  the  vector. The sum of the squared differences between each
                        component and the mean is computed.  The variance is the sum divided by  the  length  of
                        the vector minus 1.

              This last set of functions returns a vector of the same length as the argument.

              invert    Returns vector with elements in reversed order.

              norm      Scales the values of the vector to lie in the range [0.0..1.0].

              row       Psuedo function to get the current row.

              sort      Returns the vector components sorted in ascending order.

              shift(nVec,N)
                        This is the only function taking a second arg.  It provides a version of nvec shifted by
                        N  places.   When N is a scalar or vector with only one element, shift fills vacant area
                        with 0. Otherwise the second element of nVec is used for the fill value.   One  use  for
                        this is providing running totals.

       vector names ?pattern?
              Return names of all defined vectors.

       vector op operation vecName ?arg?...
              Invoke  instance operation.  Supported operations are defined in the next section.  Op is the only
              way to invoke instance operation sub-commands when -command is defined as empty in a  vector.   It
              also allows writing vector code that is checkable by a syntax checkers.  eg.

              vector create v1
              v1 op append {1 2 3}
              v1 op modify 1 2.1

INSTANCE OPERATIONS

       You  can  also use the vector's Tcl command to query or modify it.  The general form is vecName operation
       ?arg?...  Note this is equivalent to the form: vector op operation vecName ?arg?...  Both  operation  and
       its  arguments  determine  the  exact  behavior of the command.  The operations available for vectors are
       listed below.

       vecName + item
              vecName - item vecName * item vecName / item Perform binary op and return result as a list.

       vecName append item ?item?...
              Appends the component values from item to vecName.  Item can be either the name of a vector  or  a
              list of numeric values.

       vecName binread channel ?length? ?switches?
              Reads  binary  values  from  a Tcl channel. Values are either appended to the end of the vector or
              placed at a given index (using the -at option), overwriting existing values.  Data is  read  until
              EOF is found on the channel or a specified number of values length are read (note that this is not
              necessarily the same as the number of bytes). The following switches are supported:

              -swap  Swap bytes and words.  The default endian is the host machine.

              -at index
                     New values will start at vector index index.  This will overwrite any current values.

              -format format
                     Specifies  the  format  of the data.  Format can be one of the following: "i1", "i2", "i4",
                     "i8", "u1, "u2", "u4", "u8", "r4", "r8", or "r16".  The  number  indicates  the  number  of
                     bytes  required  for  each  value.   The letter indicates the type: "i" for signed, "u" for
                     unsigned, "r" or real.  The default format is "r16".

       vecName binwrite channel ?length? ?-at index?
              Like binread, but writes data.

       vecName clear
              Clears the element indices from the array variable associated with vecName.  This  doesn't  affect
              the  components  of  the vector.  By default, the number of entries in the Tcl array doesn't match
              the number of components in the vector.  This is because its too  expensive  to  maintain  decimal
              strings  for  both the index and value for each component.  Instead, the index and value are saved
              only when you read or write an element with a new index.  This command removes the index and value
              strings from the array.  This is useful when the vector is large.

       vecName delete index ?index?...
              Deletes the indexth component from the vector vecName.  Index is the index of the  element  to  be
              deleted.  This is the same as unsetting the array variable element index.  The vector is compacted
              after all the indices have been deleted.

       vecName dup destName
              Copies  vecName  to  destName. DestName is the name of a destination vector.  If a vector destName
              already exists, it is overwritten with the components of  vecName.   Otherwise  a  new  vector  is
              created.

       vecName expr expression
              Computes  the  expression and resets the values of the vector accordingly.  Both scalar and vector
              math operations are allowed.  All values in expressions  are  either  real  numbers  or  names  of
              vectors.  All numbers are treated as one component vectors.

       vecName index index ?value?...
              Get/set individual vector values.  This provides element updating when -variable is set to empty.

       vecName insert index item ?item?...
              Inserts the component values from item to vecName at index Item can be either the name of a vector
              or a list of numeric values.

       vecName length ?newSize?
              Queries  or  resets  the  number of components in vecName.  NewSize is a number specifying the new
              size of the vector.  If newSize is smaller than the current size of vecName, vecName is truncated.
              If newSize is greater, the vector is extended and the new components are initialized to  0.0.   If
              no newSize argument is present, the current length of the vector is returned.

       vecName matrix  ...
              Matrix  provides  a  2D  array view into 1D data.  It provides indexing operations in ROW,COL form
              making it suitable for use with TkTable.  Data storage remains unchanged: vectors are still just a
              single long array.  For example, here are two ways to create a 3 column by 10 row matrix:

              vector create aVec(10,3)
              vector create bVec(30)
              bVec matrix numcols 3
              set aVec(0,0) 99
              set bVec(29,2) -99
              aVec append {5 6 7}; # aVec now has 11 rows.
              aVec append 1 2;     # Now aVec has 13 rows!

       Note that data is appended only in increments of numcols.  Elements 0-2 make up the first  row,  3-5  the
       second, etc.  Elements will appear only in increments of the column size.

              vecName matrix copy dstcolumn srccolumn ?srcVec?
                     Copy  a  column  of element values to column dstcolumn from srccolumn.  If vector srcVec is
                     given, and not the same as vecName, the columns numbers must be different.  If  the  srcVec
                     column  is  longer, vecName will be extended.  If shorter, remaining destination values are
                     not overwritten.

              vecName matrix delete column.
                     Delete elements in a column.  Note that numcols, which must be  greater  than  1,  will  be
                     decremented.

              vecName matrix get column
                     Get  the  element  in  a column:  this number must be less than numcols.  Note that numcols
                     must be non-zero.

              vecName matrix insert column ?initvalue? .
                     Insert a new column of elements at column (default 0).  The new column is initialized  with
                     initvalue, or 0.0 if not specified.  Note that numcols will be incremented.

              vecName matrix multiply srcVec ?dstVec?
                     Perform  matrix  multiplication using srcVec, placing results either in dstVec, or returned
                     as a list.  The numrows of srcVec must equal  numcols  in  vecName.   One  application  for
                     multiply is coordinate transformation.

              vecName matrix numcols ?size?
                     Get  or  set the number of columns for a vectors data.  Values >1 enable array variables to
                     accept 2d matrix indexes.  For example with a numcols of 10, $vec1(1,2) refers to the  13th
                     element  in  the  vector. A vectors size is also constrained to multiples of numcols, as is
                     it's offset.  By default, numcols is 1.

              vecName matrix numrows ?size?
                     Get or set the length of rows in a columns for a vector.  By  default,  this  is  just  the
                     vector  length/numcols.  Setting this value simply provides a convenient way to increase or
                     decrease the vector size by multiples of numcols.

              vecName matrix set column ?valuelist?
                     Set value  elements in a column:  this number must be less than numcols.  The valuelist  is
                     a  list  values.   If this list is shorter than the column, it's last value is used for all
                     remaining columns. The column gets set to the values of item, or 0.0 by default.

              vecName matrix shift column amount ?startoffset?
                     Shifts the values of a column by integer inamount.  A negative value  shifts  upward.   The
                     startoffset indicates where to start shifting from.

              vecName matrix sort column ?-reverse?
                     Sort the vector by the given column.

              vecName matrix transpose
                     Transpose  all  columns  with  rows  in matrix.  Note that this is a no-op if numcols is 1.
                     Otherwise, numcols will change to vectorLength/numcols.

       vecName merge srcName ?srcName?...
              Merges the named vectors into a single vector.  The resulting vector  is  formed  by  merging  the
              components of each source vector one index at a time.

       vecName notify ?keyword? ?script?
              Queries or controls how vector clients are notified of changes to the vector.  Also allows setting
              a notifier callback.  The exact behavior is determined by keyword.

              always Indicates that clients are to be notified immediately whenever the vector is updated.

              never  Indicates that no clients are to be notified.

              whenidle
                     Indicates  that  clients  are  to be notified at the next idle point whenever the vector is
                     updated.

              now    If any client notifications is currently pending, they are notified immediately.

              cancel Cancels pending notifications of clients using the vector.

              pending
                     Returns 1 if a client notification is pending, and 0 otherwise.

              callback ?script?
                     Query or set a Tcl callback script that is evaluated when a vector is updated.

       vecName populate destName ?density?
              Creates a vector destName which  is  a  superset  of  vecName.   DestName  will  include  all  the
              components  of  vecName,  in  addition  the  interval between each of the original components will
              contain a density number of new components,  whose  values  are  evenly  distributed  between  the
              original  components  values.   This is useful for generating abscissas to be interpolated along a
              spline.

       vecName range firstIndex ?lastIndex?...
              Returns a list of numeric values representing the vector  components  between  two  indices.  Both
              firstIndex  and  lastIndex  are  indices  representing  the range of components to be returned. If
              lastIndex is less than firstIndex, the components are listed in reverse order.

       vecName search value ?value?
              Searches for a value or range of values among the components of vecName.  If one value argument is
              given, a list of indices of the components which equal value is returned.  If a  second  value  is
              also provided, then the indices of all components which lie within the range of the two values are
              returned.  If no components are found, then "" is returned.

       vecName set item
              Resets  the  components of the vector to item. Item can be either a list of numeric expressions or
              another vector.

       vecName seq start ?finish? ?step?
              Generates a sequence of values starting with the value start.  Finish  indicates  the  terminating
              value  of  the  sequence.   The  vector is automatically resized to contain just the sequence.  If
              three arguments are present, step designates the interval.

              With only two arguments (no finish argument), the sequence  will  continue  until  the  vector  is
              filled.  With one argument, the interval defaults to 1.0.

       vecName sort ?-reverse? ?argName?...
              Sorts  the  vector  vecName  in  increasing order.  If the -reverse flag is present, the vector is
              sorted in decreasing order.  If other arguments argName are present, they are the names of vectors
              which will be rearranged in the same manner as vecName.  Each vector must be the  same  length  as
              vecName.   You  could use this to sort the x vector of a graph, while still retaining the same x,y
              coordinate pairs in a y vector.

       vecName split dstName ?dstName?...
              Split the vector into a multiple vectors.  The  resulting  N  vectors  each  contain  the  mod-Nth
              element from source.

       vecName variable varName
              Maps  a Tcl variable to the vector, creating another means for accessing the vector.  The variable
              varName can't already exist. This overrides any current variable mapping the vector may have.

C LANGUAGE API

       You can create, modify, and destroy vectors from C code, using library routines.  You need to include the
       header file blt.h. It contains the definition of the structure Blt_Vector, which represents  the  vector.
       It appears below.

              typedef struct {
                  double *valueArr;
                  int numValues;
                  int arraySize;
                  double min, max;
              } Blt_Vector;

       The field valueArr points to memory holding the vector components.  The components are stored in a double
       precision  array,  whose  size size is represented by arraySize.  NumValues is the length of vector.  The
       size of the array is always equal to or larger than the length of the vector.  Min and  max  are  minimum
       and maximum component values.

LIBRARY ROUTINES

       The  following  routines  are  available  from C to manage vectors.  Vectors are identified by the vector
       name.

       Blt_CreateVector

         Synopsis:

                   int Blt_CreateVector (interp, vecName, length, vecPtrPtr)
                                Tcl_Interp *interp;
                                char *vecName;
                                int length;
                                Blt_Vector **vecPtrPtr;

         Description:
                   Creates a new vector vecName with a length of length.  Blt_CreateVector creates  both  a  new
                   Tcl  command  and  array  variable vecName.  Neither a command nor variable named vecName can
                   already exist.  A pointer to the vector is placed into vecPtrPtr.

         Results:  Returns TCL_OK if the vector is successfully created.  If length is negative, a Tcl  variable
                   or  command  vecName  already  exists,  or  memory  cannot  be allocated for the vector, then
                   TCL_ERROR is returned and interp->result will contain an error message.

       Blt_DeleteVectorByName

         Synopsis:

                   int Blt_DeleteVectorByName (interp, vecName)
                                Tcl_Interp *interp;
                                char *vecName;

         Description:
                   Removes the vector vecName.  VecName is the name of a vector which must already exist.   Both
                   the  Tcl command and array variable vecName are destroyed.  All clients of the vector will be
                   notified immediately that the vector has been destroyed.

         Results:  Returns TCL_OK if the vector is successfully deleted.  If vecName is not the name  a  vector,
                   then TCL_ERROR is returned and interp->result will contain an error message.

       Blt_DeleteVector

         Synopsis:

                   int Blt_DeleteVector (vecPtr)
                                Blt_Vector *vecPtr;

         Description:
                   Removes  the  vector pointed to by vecPtr.  VecPtr is a pointer to a vector, typically set by
                   Blt_GetVector or Blt_CreateVector.  Both the Tcl command and array variable of the vector are
                   destroyed.  All clients of the vector will be notified immediately that the vector  has  been
                   destroyed.

         Results:  Returns  TCL_OK  if the vector is successfully deleted.  If vecName is not the name a vector,
                   then TCL_ERROR is returned and interp->result will contain an error message.

       Blt_GetVector

         Synopsis:

                   int Blt_GetVector (interp, vecName, vecPtrPtr)
                                Tcl_Interp *interp;
                                char *vecName;
                                Blt_Vector **vecPtrPtr;

         Description:
                   Retrieves the vector vecName.  VecName is the name of a  vector  which  must  already  exist.
                   VecPtrPtr will point be set to the address of the vector.

         Results:  Returns  TCL_OK  if  the  vector  is successfully retrieved.  If vecName is not the name of a
                   vector, then TCL_ERROR is returned and interp->result will contain an error message.

       Blt_ResetVector

         Synopsis:

                   int Blt_ResetVector (vecPtr, dataArr,
                     numValues, arraySize, freeProc)
                                Blt_Vector *vecPtr;
                                double *dataArr;
                                int *numValues;
                                int *arraySize;
                                Tcl_FreeProc *freeProc;

         Description:
                   Resets the components of the vector pointed  to  by  vecPtr.   Calling  Blt_ResetVector  will
                   trigger  the vector to dispatch notifications to its clients. DataArr is the array of doubles
                   which represents the vector data. NumValues is the number of elements in the array. ArraySize
                   is the actual size of the array (the array may be bigger than the number of values stored  in
                   it).  FreeProc  indicates  how  the  storage  for  the  vector  component array (dataArr) was
                   allocated.  It is used to determine how to reallocate memory when the vector  is  resized  or
                   destroyed.   It  must be TCL_DYNAMIC, TCL_STATIC, TCL_VOLATILE, or a pointer to a function to
                   free the memory allocated for the vector array. If freeProc  is  TCL_VOLATILE,  it  indicates
                   that dataArr must be copied and saved.  If freeProc is TCL_DYNAMIC, it indicates that dataArr
                   was  dynamically  allocated  and that Tcl should free dataArr if necessary.  Static indicates
                   that nothing should be done to release storage for dataArr.

         Results:  Returns TCL_OK if the vector is successfully resized.   If  newSize  is  negative,  a  vector
                   vecName  does  not  exist,  or  memory  cannot be allocated for the vector, then TCL_ERROR is
                   returned and interp->result will contain an error message.

       Blt_ResizeVector

         Synopsis:

                   int Blt_ResizeVector (vecPtr, newSize)
                                Blt_Vector *vecPtr;
                                int newSize;

         Description:
                   Resets the length of the vector pointed to by vecPtr to newSize.  If newSize is smaller  than
                   the  current  size  of  the  vector,  it  is truncated.  If newSize is greater, the vector is
                   extended and the new components are initialized to 0.0.  Calling Blt_ResetVector will trigger
                   the vector to dispatch notifications.

         Results:  Returns TCL_OK if the vector is successfully resized.  If newSize is negative or  memory  can
                   not  be  allocated for the vector, then TCL_ERROR is returned and interp->result will contain
                   an error message.

         Blt_VectorExists

            Synopsis:

                      int Blt_VectorExists (interp, vecName)
                                  Tcl_Interp *interp;
                                  char *vecName;

            Description:
                      Indicates if a vector named vecName exists in interp.

            Results:  Returns 1 if a vector vecName exists and 0 otherwise.

         If your application needs to be notified when a  vector  changes,  it  can  allocate  a  unique  client
         identifier  for  itself.   Using this identifier, you can then register a call-back to be made whenever
         the vector is updated or destroyed.  By default, the call-backs are made at the next idle point.   This
         can  be changed to occur at the time the vector is modified.  An application can allocate more than one
         identifier for any vector.  When the client application is done with the vector,  it  should  free  the
         identifier.

         The call-back routine must of the following type.

                       typedef void (Blt_VectorChangedProc) (Tcl_Interp *interp,
                          ClientData clientData, Blt_VectorNotify notify);

         ClientData  is  passed  to this routine whenever it is called.  You can use this to pass information to
         the call-back.  The notify argument indicates whether the vector has been updated of destroyed.  It  is
         an enumerated type.

                       typedef enum {
                           BLT_VECTOR_NOTIFY_UPDATE=1,
                           BLT_VECTOR_NOTIFY_DESTROY=2
                       } Blt_VectorNotify;

         Blt_AllocVectorId

            Synopsis:

                      Blt_VectorId Blt_AllocVectorId (interp, vecName)
                                  Tcl_Interp *interp;
                                  char *vecName;

            Description:
                      Allocates  an  client identifier for with the vector vecName.  This identifier can be used
                      to specify a call-back which is triggered when the vector is updated or destroyed.

            Results:  Returns a client identifier if successful.  If vecName is not the name of a  vector,  then
                      NULL is returned and interp->result will contain an error message.

         Blt_GetVectorById

            Synopsis:

                      int Blt_GetVector (interp, clientId, vecPtrPtr)
                                  Tcl_Interp *interp;
                                  Blt_VectorId clientId;
                                  Blt_Vector **vecPtrPtr;

            Description:
                      Retrieves  the  vector  used  by  clientId.   ClientId is a valid vector client identifier
                      allocated by Blt_AllocVectorId.  VecPtrPtr will point be set to the address of the vector.

            Results:  Returns TCL_OK if the vector is successfully retrieved.

         Blt_SetVectorChangedProc

            Synopsis:

                      void Blt_SetVectorChangedProc (clientId, proc, clientData);
                                  Blt_VectorId clientId;
                                  Blt_VectorChangedProc *proc;
                                  ClientData *clientData;

            Description:
                      Specifies a call-back routine to be called whenever the vector associated with clientId is
                      updated or deleted.  Proc is a pointer to call-back  routine  and  must  be  of  the  type
                      Blt_VectorChangedProc.  ClientData is a one-word value to be passed to the routine when it
                      is invoked. If proc is NULL, then the client is not notified.

            Results:  The  designated  call-back  procedure  will  be  invoked  when  the  vector  is updated or
                      destroyed.

         Blt_FreeVectorId

            Synopsis:

                      void Blt_FreeVectorId (clientId);
                                  Blt_VectorId clientId;

            Description:
                      Frees the client identifier.  Memory allocated for the identifier is released.  The client
                      will no longer be notified when the vector is modified.

            Results:  The designated call-back procedure will be no longer be invoked when the vector is updated
                      or destroyed.

         Blt_NameOfVectorId

            Synopsis:

                      char *Blt_NameOfVectorId (clientId);
                                  Blt_VectorId clientId;

            Description:
                      Retrieves the name of the vector associated with the client identifier clientId.

            Results:  Returns the name of the vector associated with clientId.  If clientId is not an identifier
                      or the vector has been destroyed, NULL is returned.

         Blt_InstallIndexProc

            Synopsis:

                      void Blt_InstallIndexProc (indexName, procPtr)
                                  char *indexName;
                                  Blt_VectorIndexProc *procPtr;

            Description:
                      Registers a function to be called to retrieved the index indexName from the vector's array
                      variable.

                      typedef double Blt_VectorIndexProc(Vector *vecPtr);

                      The function will be passed a pointer to the vector.  The function must  return  a  double
                      representing the value at the index.

            Results:  The new index is installed into the vector.

C API EXAMPLE

       The following example opens a file of binary data and stores it in an array of doubles. The array size is
       computed  from the size of the file. If the vector "data" exists, calling Blt_VectorExists, Blt_GetVector
       is called to get the pointer to the vector.  Otherwise the routine Blt_CreateVector is called to create a
       new vector and returns a pointer to it. Just like the Tcl interface, both a new  Tcl  command  and  array
       variable  are  created when a new vector is created. It doesn't make any difference what the initial size
       of the vector is since it will be reset shortly. The vector is updated  when  lt_ResetVector  is  called.
       Blt_ResetVector  makes the changes visible to the Tcl interface and other vector clients (such as a graph
       widget).

              #include <tcl.h>
              #include <blt.h>
              ...
              Blt_Vector *vecPtr;
              double *newArr;
              FILE *f;
              struct stat statBuf;
              int numBytes, numValues;

              f = fopen("binary.dat", "r");
              fstat(fileno(f), &statBuf);
              numBytes = (int)statBuf.st_size;

              /* Allocate an array big enough to hold all the data */
              newArr = (double *)malloc(numBytes);
              numValues = numBytes / sizeof(double);
              fread((void *)newArr, numValues, sizeof(double), f);
              fclose(f);

              if (Blt_VectorExists(interp, "data"))  {
                  if (Blt_GetVector(interp, "data", &vecPtr) != TCL_OK) {
                return TCL_ERROR;
                  }
              } else {
                 if (Blt_CreateVector(interp, "data", 0, &vecPtr) != TCL_OK) {
                return TCL_ERROR;
                 }
              }
              /*
               * Reset the vector. Clients will be notified when Tk is idle.
               * TCL_DYNAMIC tells the vector to free the memory allocated
               * if it needs to reallocate or destroy the vector.
               */
              if (Blt_ResetVector(vecPtr, newArr, numValues, numValues,
                TCL_DYNAMIC) != TCL_OK) {
                  return TCL_ERROR;
              }

INCOMPATIBILITIES

       In previous versions, if the array variable isn't global (i.e. local to a Tcl procedure), the  vector  is
       automatically destroyed when the procedure returns.

              proc doit {} {
                  # Temporary vector x
                  vector x(10)
                  set x(9) 2.0
                    ...
              }

       This  has  changed.   Variables  are  not  automatically destroyed when their variable is unset.  You can
       restore the old behavior by setting the "-watchunset" switch.

KEYWORDS

       vector, graph, widget

BLT                                                    2.5                                     blt::vector(3tcl)