| Karim Belabas on Mon, 13 Feb 2012 20:02:08 +0100 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
| Re: matconcat |
* Andreas Enge [2012-02-13 19:28]:
> A user can easily provide building blocks of the required dimensions using
> matdiagonal, for instance, or c*matid(d), or matrix(m,n) for simple
> building blocks of the right dimension.
Simple test-case :
? A = 1; B = [1,2;3,4]; C = [1,2,3;4,5,6;7,8,9]
? matconcat(matdiagonal([A,B,C])) \\ current implementation
%2 =
[1 0 0 0 0 0]
[0 1 2 0 0 0]
[0 3 4 0 0 0]
[0 0 0 1 2 3]
[0 0 0 4 5 6]
[0 0 0 7 8 9]
Please provide "easy" building blocks of the required dimensions. :-)
The "best" I can come up with is
{
matconcat([A, vector(2), vector(3);
vectorv(2), B, matrix(2,3);
vectorv(3), matrix(3,2), C]);
}
I believe this demonstrates the usefulness of "extendable 0-blocks", at least.
I kind of like to interpret a scalar as c*Id_{proper dimension}, but this is
maybe less useful.
It would be nice to be able to write
M = matrix(6,6);
M[1,1] = A;
M[2..3, 2..3] = B;
M[4.., 4..] = C;
But this currently does not work.
Cheers,
K.B.
P.S: Granted, this would be better solved in matdiagonal() itself, which could
interpret properly "block" diagonal elements (square matrices instead of the
expected scalar).
P.S2;
I found old GP scripts of mine with nasty examples:
vconcat(a,b) = concat(a~, b~)~
rebuild(H, B, dep) =
{ my(top, bot, l,h);
top = concat(vconcat(dep, H), B);
h = matsize(B)[2];
l = matsize(H)[1];
bot = concat(matrix(h,l), matid(h));
vconcat(top, bot);
}
This becomes \\ current implementation
matconcat([matconcat([dep,H]~), B; 0, matid(#B)])
Marginally nicer, with '1' = 1 * Id_{proper dimension}
matconcat([matconcat([dep,H]~), B; 0, 1])
--
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]
`