bionic (3) blt::vector.3tcl.gz

Provided by: blt-dev_2.5.3+dfsg-4_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