Karim Belabas on Sun, 12 Feb 2012 17:09:22 +0100 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
matconcat |
Hi pari-dev, I implemented a convenience GP function matconcat(v), which builds a (block) matrix from the components of v (see the examples below in P.S). For instance matconcat([A, B; C, D]) builds the matrix : [A | B] [-----] [C | D] The building blocks may be t_MAT, t_VEC [ row matrix ], t_COL [ column matrix ] and even scalars [ 1x1 matrix ] All this is straightforward when all dimensions match up, but I have a problem when they don't. What to do in this case ? I see at least 3 possibilities: 1) reject and raise an exception. 2) consider a scalar 'x' as x * matid(proper dimension), e.g. matconcat([3, matid(2); matid(2), 4]) %1 = [3 0 1 0] [0 3 0 1] [1 0 4 0] [0 1 0 4] 3) extend the blocks as needed, by rows and columns of 0 e.g. matconcat([3, matid(2); matid(2), 4]) %1 = [3 0 1 0] [0 0 0 1] [1 0 4 0] [0 1 0 0] 1) is simplest conceptually but somewhat contrary to the general PARI philosophy [ = try to make sense of all inputs, provided the specification can be documented in an elegant way ] 2) is already useful, but doesn't allow e.g. matconcat(matdiagonal([[1,2;3,4], [1,2,3;4,5,6;7,8,9]])) [ = diagonal block matrix ] One can always add special cases, e.g. allow a "0" scalar, to represent an arbitrary rectangular block of zeroes, but it quickly becomes awkward. 3) is the current implementation, and e.g. returns [1 2 0 0 0] [3 4 0 0 0] [0 0 1 2 3] [0 0 4 5 6] [0 0 7 8 9] on the above matdiagonal() input. It is very easy to describe and implement; unfortunately - we have to extend by zeroes in given directions [ currently to the right & bottom ] without an easy way to extend otherwise, - this somewhat conlicts with how we currently treat scalars and square matrices: ? matid(2) - 3 %1 = [-2 0] [ 0 -2] i.e. "3" is interpreted as 3 * Id_2, not as [3,0; 0,0]. What do you think ? Cheers, K.B. P.S.: (14:56) gp > ??matconcat matconcat(v): Returns a t_MAT built from the entries of v, which may be a t_VEC (concatenate horizontally), a t_COL (concatenate vertically), or a t_MAT (concatenate vertically each column, and concatenate vertically the resulting matrices). The entries of v are always considered as matrices: they can themselves be t_VEC (seen as a row matrix), a t_COL seen as a column matrix), a t_MAT, or a scalar (seen as an 1 x 1 matrix). ? A=[1,2;3,4]; B=[5,6]~; C=[7,8]; D=9; ? matconcat([A, B]) \\ horizontal %1 = [1 2 5] [3 4 6] ? matconcat([A, C]~) \\ vertical %2 = [1 2] [3 4] [7 8] ? matconcat([A, B; C, D]) \\ block matrix %3 = [1 2 5] [3 4 6] [7 8 9] If the dimensions of the entries to concatenate do not match up, they are extended by 0 columns on the right and 0 rows at the bottom, as needed: ? matconcat([1, [2,3]~, [4,5,6]~]) \\ horizontal %4 = [1 2 4] [0 3 5] [0 0 6] ? matconcat([1, [2,3], [4,5,6]]~) \\ vertical %5 = [1 0 0] [2 3 0] [4 5 6] ? matconcat([B, C; A, D]) \\ block matrix %6 = [5 0 7 8] [6 0 0 0] [1 2 9 0] [3 4 0 0] -- Karim Belabas, IMB (UMR 5251) Tel: (+33) (0)5 40 00 26 17 Universite Bordeaux 1 Fax: (+33) (0)5 40 00 69 50 351, cours de la Liberation http://www.math.u-bordeaux1.fr/~belabas/ F-33405 Talence (France) http://pari.math.u-bordeaux1.fr/ [PARI/GP] `