| 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]
`