2 mat - keyword to create a matrix value
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, ...} ]
10 mat [index-range-list_1[index-ranges-list_2] ... [ = { { ...} ...} ]
12 decl id_1 id_2 ... [index-range-list] ...
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
19 decl declarator = global, static or local
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
26 mat A B ... [index-range-list]
30 A = B = ... = mat[index-range-list]
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.
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.
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.
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, ...].
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]
59 A[0,0], A[0,1], A[0,2], A[1,0], A[1,,1], A[1,2].
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.
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
70 A = {value_0, value_1, ...}
72 assigns the values value_0, value_1, ... to the elements A[[0]],
73 A[[1]], ... Any blank "value" is passed over. For example,
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;
81 If the index-range is left blank but an initializer list is specified
85 B = mat[] = {1, , 3, }
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].
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}.
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
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].)
122 The function ismat(V) returns 1 if V is a matrix, 0 otherwise.
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.
131 If V is matrix-valued, test(V) returns 0 if every element of V tests
132 as zero; otherwise 1 is returned.
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).
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).
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:
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];
159 The default printing may be restored by
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
171 mat [2][3] = {{1,2,3},{4,5,6}}
173 An example of the use of mat with a declarator is
175 global mat A B [2,3], C [4]
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].
180 Some operations are defined for matrices.
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,
187 matmax(A,i) - matmin(A,i) == matmax(B,i) - matmin(B,i),
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).
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.
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
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,
217 C[i,j] = Sum A[i,k] * B[k,j]
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.
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[].
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.
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.
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.
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].
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.
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.
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
292 If A and B are one-dimension and of size 3, cp(A, B) returns their
295 randperm(A) returns a matrix indexed the same as A in which the elements
296 of A have been randomly permuted.
298 sort(A) returns a matrix indexed the same as A in which the elements
299 of A have been sorted.
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).
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.
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.
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
323 reverse(A) returns a matrix with the same index-lists as A but the
324 elements in reversed order.
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.
333 > mat A[5] = {1, 2+3i, "ab", mat[2] = {4,5}. obj point = {6,7}}
335 mat [5] (5 elements, 5 nonzero):
339 [3] = mat [2] (2 elements, 2 nonzero)
340 [4] = obj point {6, 7}
342 > print A[0], A[1], A[2], A[3][0], A[4].x
345 > define point_add(a,b) = obj point = {a.x + b.x, a.y + b.y}
346 point_add(a,b) defined
348 > mat [B] = {8, , "cd", mat[2] = {9,10}, obj point = {11,12}}
351 mat [5] (5 elements, 5 nonzero):
355 [3] = mat [2] (2 elements, 2 nonzero)
356 [4] = obj point {17, 19}
358 > mat C[2,2] = {1,2,3,4}
361 mat [2,2] (4 elements, 4 nonzero):
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
375 > mat A[4] = {1,2,3,4}, A * reverse(A);
377 mat [4] (4 elements, 4 nonzero):
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.
395 ismat, matdim, matmax, matmin, mattrans, mattrace, matsum, det, inverse,
396 isident, test, config, search, rsearch, reverse, copy, blkcpy, dp, cp,