Initial revision
[LeanCalc.git] / help / mat
1 NAME
2    mat - keyword to create a matrix value
3
4 SYNOPSIS
5    mat [index-range-list] [ = {value_0. ...} ]
6    mat [] [= {value_0, ...}]
7    mat variable_1 ... [index-range-list] [ = {value_0, ...} ]
8    mat variable_1 ... [] [ = {value_0, ...} ]
9
10    mat [index-range-list_1[index-ranges-list_2] ... [ = { { ...} ...}  ]
11
12    decl id_1 id_2 ... [index-range-list] ...
13
14 TYPES
15    index-range-list     range_1 [, range_2, ...]  up to 4 ranges
16    range_1, ...         integer, or integer_1 : integer_2
17    value, value_1, ...  any
18    variable_1 ...       lvalue
19    decl                 declarator = global, static or local
20    id_1, ...            identifier
21
22 DESCRIPTION
23    The expression  mat [index-range-list]  returns a matrix value.
24    This may be assigned to one or more lvalues A, B, ... by either
25
26         mat A B ... [index-range-list]
27
28    or
29
30         A = B = ... = mat[index-range-list]
31
32    If a variable is specified by an expression that is not a symbol with
33    possibly object element specifiers, the expression should be enclosed
34    in parentheses.  For example, parentheses are required in
35    mat (A[2]) [3]  and  mat (*p) [3]  but  mat P.x [3] is acceptable.
36
37    When an index-range is specified as integer_1 : integer_2, where
38    integer_1 and integer_2 are expressions which evaluate to integers,
39    the index-range consists of all integers from the minimum of the
40    two integers to the maximum of the two integers.  For example,
41    mat[2:5, 0:4] and mat[5:2, 4:0] return the same matrix value.
42
43    If an index-range is an expression which evaluates to an integer,
44    the range is as if specified by 0 : integer - 1.  For example,
45    mat[4] and mat[0:3] return the same 4-element matrix; mat[-2] and
46    mat[-3:0] return the same 4-element matrix.
47
48    If the variable A has a matrix value, then for integer indices
49    i_1, i_2, ..., equal in number to the number of ranges specified at
50    its creation, and such that each index is in the corresponding range,
51    the matrix element associated with those index list is given as an
52    lvalue by the expressions A[i_1, i_2, ...].
53
54    The elements of the matrix are stored internally as a linear array
55    in which locations are arranged in order of increasing indices.
56    For example, in order of location, the six element of A = mat [2,3]
57    are
58
59         A[0,0], A[0,1], A[0,2], A[1,0], A[1,,1], A[1,2].
60
61    These elements may also be specified using the double-bracket operator
62    with a single integer index as in A[[0]], A[[1]], ..., A[[5]].
63    If p is assigned the value &A[0.0], the address of A[[i]] for 0 <= i < 6
64    is p + i as long as A exists and a new value is not assigned to A.
65
66    When a matrix is created, each element is initially assigned the
67    value zero.  Other values may be assigned then or later using the
68    "= {...}" assignment operation.  Thus
69
70         A = {value_0, value_1, ...}
71
72    assigns the values value_0, value_1, ... to the elements A[[0]],
73    A[[1]], ...  Any blank "value" is passed over.  For example,
74
75         A = {1, , 2}
76
77    will assign the value 1 to A[[0]], 2 to A[[2]] and leave all other
78    elements unchanged.  Values may also be assigned to elements by
79    simple assignments, as in A[0,0] = 1, A[0,2] = 2;
80
81    If the index-range is left blank but an initializer list is specified
82    as in
83
84         mat A[] = {1, 2 }
85         B = mat[] = {1, , 3, }
86
87    the matrix created is one-dimensional.  If the list contains a
88    positive number n of values or blanks, the result is as if the
89    range were specified by [n], i.e. the range of indices is from
90    0 to n - 1.  In the above examples, A is of size 2 with A[0] = 1
91    and A[1] = 2;  B is of size 4 with B[0] = 1, B[1] = B[3] = 0,
92    B[2] = 3.  The specification mat[] = { } creates the same as mat[1].
93
94    If the index-range is left blank and no initializer list is specified,
95    as in  mat C[]  or  C = mat[], the matrix assigned to C has zero
96    dimension; this has one element C[].  To assign a value using "= { ...}"
97    at the same time as creating C, parentheses are required as in
98    (mat[]) = {value}  or  (mat C[]) = {value}.  Later a value may be
99    assigned to C[] by  C[] = value  or  C = {value}.
100
101    The value assigned at any time to any element of a matrix can be of
102    any type - number, string, list, matrix, object of previously specified
103    type, etc.  For some matrix operations there are of course conditions
104    that elements may have to satisfy: for example, addition of matrices
105    requires that addition of corresponding elements be possible.
106    If an element of a matrix is a structure for which indices or an
107    object element specifier is required, an element of that structure is
108    referred to by appropriate uses of [ ] or ., and so on if an element
109    of that element is required.  For example, one may have an expressions
110    like
111
112                 A[1,2][3].alpha[2];
113
114    if A[1,2][3].alpha is a list with at least three elements, A[1,2][3] is
115    an object of a type like  obj {alpha, beta}, A[1,2] is a matrix of
116    type mat[4] and A is a mat[2,3] matrix.  When an element of a matrix
117    is a matrix and the total number of indices does not exceed 4, the
118    indices can be combined into one list, e.g. the A[1,2][3] in the
119    above example can be shortened to A[1,2,3].  (Unlike C, A[1,2] cannot
120    be expressed as A[1][2].)
121
122    The function ismat(V) returns 1 if V is a matrix, 0 otherwise.
123
124    isident(V) returns 1 if V is a square matrix with diagonal elements 1,
125    off-diagonal elements zero, or a zero- or one-dimensional matrix with
126    every element 1; otherwise zero is returned.  Thus  isident(V) = 1
127    indicates that for  V * A  and  A * V  where A is any matrix of
128    for which either product is defined and the elements of A are real
129    or complex numbers, that product will equal A.
130
131    If V is matrix-valued, test(V) returns 0 if every element of V tests
132    as zero; otherwise 1 is returned.
133
134    The dimension of a matrix A, i.e. the number of index-ranges in the
135    initial creation of the matrix, is returned by the function matdim(A).
136    For 1 <= i <= matdim(A), the minimum and maximum values for the i-th
137    index range are returned by matmin(A, i) and matmax(A,i), respectively.
138    The total number of elements in the matrix is returned by size(A).
139    The sum of the elements in the matrix is returned by matsum(A).
140
141    The default method of printing matrices is to give a line of information
142    about the matrix, and to list on separate lines up to 15 elements,
143    the indices and either the value (for numbers, strings, objects) or
144    some descriptive information for lists or matrices, etc.
145    Numbers are displayed in the current number-printing mode.
146    The maximum number of elements to be printed can be assigned
147    any nonnegative integer value m by config("maxprint", m).
148
149    Users may define another method of printing matrices by defining a
150    function mat_print(M); for example, for a not too big 2-dimensional
151    matrix A it is a common practice to use a loop like:
152
153                 for (i = matmin(A,1); i <= matmax(A,1); i++) {
154                         for (j = matmin(A,2); j <= matmax(A,2); j++)
155                                 printf("%8d", A[i,j];
156                         print;
157                 }
158
159    The default printing may be restored by
160
161                 undefine mat_print;
162
163
164    The keyword "mat" followed by two or more index-range-lists returns a
165    matrix with indices specified by the first list, whose elements are
166    matrices as determined by the later index-range-lists.  For
167    example  mat[2][3]  is a 2-element matrix, each of whose elements has
168    as its value a 3-element matrix.  Values may be assigned to the
169    elements of the innermost matrices by nested  = {...} operations as in
170
171                 mat [2][3] = {{1,2,3},{4,5,6}}
172
173    An example of the use of mat with a declarator is
174
175                 global mat A B [2,3], C [4]
176
177    This creates, if they do not already exist, three global variables with
178    names A, B, C, and assigns to A and B the value mat[2,3] and to C mat[4].
179
180    Some operations are defined for matrices.
181
182    A == B
183         Returns 1 if A and B are of the same "shape" and "corresponding"
184         elements are equal; otherwise 0 is returned.  Being of the same
185         shape means they have the same dimension d, and for each i <= d,
186
187             matmax(A,i) - matmin(A,i) == matmax(B,i) - matmin(B,i),
188
189         One consequence of being the same shape is that the matrices will
190         have the same size.   Elements "correspond" if they have the same
191         double-bracket indices; thus A == B implies that A[[i]] == B[[i]]
192         for 0 <= i < size(A) == size(B).
193
194    A + B
195    A - B
196         These are defined A and B have the same shape, the element
197         with double-bracket index j being evaluated by A[[j]] + B[[j]] and
198         A[[j]] - B[[j]], respectively.  The index-ranges for the results
199         are those for the matrix A.
200
201    A[i,j]
202         If A is two-dimensional, it is customary to speak of the indices
203         i, j in A[i,j] as referring to rows and columns;  the number of
204         rows is matmax(A,1) - matmin(A,1) + 1; the number of columns if
205         matmax(A,2) - matmin(A,2) + 1.  A matrix is said to be square
206         if it is two-dimensional and the number of rows is equal to the
207         number of columns.
208
209    A * B
210         Multiplication is defined provided certain conditions by the
211         dimensions and shapes of A and B are satisfied.  If both have
212         dimension 2 and the column-index-list for A is the same as
213         the row-index-list for B, C = A * B is defined in the usual
214         way so that for i in the row-index-list of A and j in the
215         column-index-list for B,
216
217                 C[i,j] =  Sum A[i,k] * B[k,j]
218
219         the sum being over k in the column-index-list of A.  The same
220         formula is used so long as the number of columns in A is the same
221         as the number of rows in B and k is taken to refer to the offset
222         from matmin(A,2) and matmin(B,1), respectively, for A and B.
223         If the multiplications and additions required cannot be performed,
224         an execution error may occur or the result for C may contain
225         one or more error-values as elements.
226
227         If A or B has dimension zero, the result for A * B is simply
228         that of multiplying the elements of the other matrix on the
229         left by A[] or on the right by B[].
230
231         If both A and B have dimension 1, A * B is defined if A and B
232         have the same size; the result has the same index-list as A
233         and each element is the product of corresponding elements of
234         A and B.  If A and B have the same index-list, this multiplication
235         is consistent with multiplication of 2D matrices if A and B are
236         taken to represent 2D matrices for which the off-diagonal elements
237         are zero and the diagonal elements are those of A and B.
238         the real and complex numbers.
239
240         If A is of dimension 1 and B is of dimension 2, A * B is defined
241         if the number of rows in B is the same as the size of A.  The
242         result has the same index-lists as B; each row of B is multiplied
243         on the left by the corresponding element of A.
244
245         If A is of dimension 2 and B is of dimension 1, A * B is defined
246         if number of columns in A is the same as the size of A.  The
247         result has the same index-lists as A; each column of A is
248         multiplied on the right by the corresponding element of B.
249
250         The algebra of additions and multiplications involving both one-
251         and two-dimensional matrices is particularly simple when all the
252         elements are real or complex numbers and all the index-lists are
253         the same, as occurs, for example, if for some positive integer n,
254         all the matrices start as  mat [n]  or  mat [n,n].
255
256     det(A)
257         If A is a square, det(A) is evaluated by an algorithm that returns
258         the determinant of A if the elements of A are real or complex
259         numbers, and if such an A is non-singular, inverse(A) returns
260         the inverse of A indexed in the same way as A.  For matrix A of
261         dimension 0 or 1, det(A) is defined as the product of the elements
262         of A in the order in which they occur in A, inverse(A) returns
263         a matrix indexed in the same way as A with each element inverted.
264
265
266    The following functions are defined to return matrices with the same
267         index-ranges as A and the specified operations performed on all
268         elements of A.  Here num is an arbitrary complex number (nonzero
269         when it is a divisor), int an integer, rnd a rounding-type
270         specifier integer, real a real number.
271
272                 num * A
273                 A * num
274                 A / num
275                 - A
276                 conj(A)
277                 A << int, A >> int
278                 scale(A, int)
279                 round(A, int, rnd)
280                 bround(A, int, rnd)
281                 appr(A, real, rnd)
282                 int(A)
283                 frac(A)
284                 A // real
285                 A % real
286                 A ^ int
287
288    If A and B are one-dimensional of the same size dp(A, B) returns
289         their dot-product, i.e. the sum of the products of corresponding
290         elements.
291
292    If A and B are one-dimension and of size 3, cp(A, B) returns their
293         cross-product.
294
295    randperm(A) returns a matrix indexed the same as A in which the elements
296         of A have been randomly permuted.
297
298    sort(A) returns a matrix indexed the same as A in which the elements
299         of A have been sorted.
300
301    If A is an lvalue whose current value is a matrix, matfill(A, v)
302         assigns the value v to every element of A, and if also, A is
303         square, matfill(A, v1, v2) assigns v1 to the off-diagonal elements,
304         v2 to the diagonal elements.  To create and assign to A the unit
305         n * n matrix, one may use matfill(mat A[n,n], 0, 1).
306
307    For a square matrix A, mattrace(A) returns the trace of A, i.e. the
308         sum of the diagonal elements.  For zero- or one-dimensional A,
309         mattrace(A) returns the sum of the elements of A.
310
311    For a two-dimensional matrix A, mattrans(A) returns the transpose
312         of A, i.e. if A is mat[m,n], it returns a mat[n,m] matrix with
313         [i,j] element equal to A[j,i].  For zero- or one-dimensional A,
314         mattrace(A) returns a matrix with the same value as A.
315
316    The functions search(A, value, start, end]) and
317    rsearch(A, value, start, end]) return the first or last index i
318    for which A[[i]] == value and start <= i < end, or if there is
319    no such index, the null value.   For further information on default
320    values and the use of an "accept" function, see the help files for
321    search and rsearch.
322
323    reverse(A) returns a matrix with the same index-lists as A but the
324    elements in reversed order.
325
326    The copy and blkcpy functions may be used to copy data to a matrix from
327    a matrix or list, or from a matrix to a list.  In copying from a
328    matrix to a matrix the matrices need not have the same dimension;
329    in effect they are treated as linear arrays.
330
331 EXAMPLE
332         > obj point {x,y}
333         > mat A[5] = {1, 2+3i, "ab", mat[2] = {4,5}. obj point = {6,7}}
334         > A
335         mat [5] (5 elements, 5 nonzero):
336           [0] = 1
337           [1] = 2+3i
338           [2] = "ab"
339           [3] = mat [2] (2 elements, 2 nonzero)
340           [4] = obj point {6, 7}
341
342         > print A[0], A[1], A[2], A[3][0], A[4].x
343         1 2+3i ab 4 6
344
345         > define point_add(a,b) = obj point = {a.x + b.x, a.y + b.y}
346         point_add(a,b) defined
347
348         > mat [B] = {8, , "cd", mat[2] = {9,10}, obj point = {11,12}}
349         > A + B
350
351         mat [5] (5 elements, 5 nonzero):
352           [0] = 9
353           [1] = 2+3i
354           [2] = "abcd"
355           [3] = mat [2] (2 elements, 2 nonzero)
356           [4] = obj point {17, 19}
357
358         > mat C[2,2] = {1,2,3,4}
359         > C^10
360
361         mat [2,2] (4 elements, 4 nonzero):
362           [0,0] = 4783807
363           [0,1] = 6972050
364           [1,0] = 10458075
365           [1,1] = 15241882
366
367         > C^-10
368
369         mat [2,2] (4 elements, 4 nonzero):
370           [0,0] = 14884.650390625
371           [0,1] = -6808.642578125
372           [1,0] = -10212.9638671875
373           [1,1] = 4671.6865234375
374
375         > mat A[4] = {1,2,3,4}, A * reverse(A);
376
377         mat [4] (4 elements, 4 nonzero):
378           [0] = 4
379           [1] = 6
380           [2] = 6
381           [3] = 4
382
383 LIMITS
384    The theoretical upper bound for the absolute values of indices is
385    2^31 - 1, but the size of matrices that can be handled in practice will
386    be limited by the availability of memory and what is an acceptable
387    runtime.  For example, although it may take only a fraction of a
388    second to invert a 10 * 10 matrix, it will probably take about 1000
389    times as long to invert a 100 * 100 matrix.
390
391 LINK LIBRARY
392    n/a
393
394 SEE ALSO
395    ismat, matdim, matmax, matmin, mattrans, mattrace, matsum, det, inverse,
396    isident, test, config, search, rsearch, reverse, copy, blkcpy, dp, cp,
397    randperm, sort
398