Thanks to Nick Cox for his correction.
AbdelRahmen
2007/10/19, n j cox <[email protected]>:
> My reaction was like Kit's: in my ignorance
> I had not heard of horizontal direct products,
> and wondered about any connection to Kronecker.
>
> No matter. Abdel has working code, and his
> approach is likely to be as direct as any other.
> I think his code can be tweaked, although the
> changes are essentially cosmetic. I would write:
>
> real matrix hdp(real matrix A, real matrix B)
> {
> assert(rows(A) == rows(B))
> real matrix C
> C = J(rows(A), 0, .)
> for (i = 1; i <= cols(A); i++) {
> C = C, (A[, i] :* B)
> }
> return(C)
> }
>
> What's different? Not much.
>
> 0. Style. I like to put spaces around most binary operators
> and after commas, if there is space to spare. 100% of the publications
> on Stata style agree. However, no spaces around * and / can be
> good style, to indicate binding.
>
> 1. You don't need to declare n, which is used only once.
>
> 2. The cutest, and this is due to Bill Gould, not me, is
> to initialise with a matrix of 0 columns. That way, you
> need take away nothing (or, more precisely, need not take away
> anything) at the end.
>
> I can't see a reason why this could not be generalised to
> complex matrices. An official program would be more informative
> if the -assert- failed.
>
> I presume there is a vertical direct product, and I guess
> that in practice it is even less used.
>
> Abdel replied to Kit Baum who replied to Abdel Rahmen El Lahga
>
> > I've never heard of a 'horizontal direct product' but in a 2x2
> > example it seems to be the first and last rows of a conventional
> > Kronecker product...
>
> the term "horizontal direct product" is used in Gauss manual ( and R i
> think) and denoted by the operator
> " *~ " and is different from the kronecker product in Gauss denoted by "
> .*. "
> You are right when tou say that "it appears that whatever this
> construction might be it
> > could be generated from a Kronecker" but the question is how to
> automate such task in Mata. You know that with matrix A(k,l), B(m,n) ;
> A#B =C(k*m,l*n) but here we want a new matrix C(k,l*n) asumming that
> k=m. Hence my motivation to write my hdp() function
> AbdelRahmen
>
> 2007/10/19, Kit Baum <[email protected]>:
> > Abdel wrote
> >
> > I've written this mata function as a solution to my own question
> > yesterday.
> > horizontal direct product (hdp).
> > --------begin code------------
> > version 9.2
> > local mydir "."
> > mata:
> > mata clear
> > real matrix hdp(real matrix A, real matrix B)
> > {
> > assert(rows(A)==rows(B))
> > real scalar n
> > real matrix C
> > n=rows(A)
> > C=J(n,1,.)
> > for (i=1; i<=cols(A); i++) {
> > C=C,(A[.,i]:*B)
> > }
> > C=C[.,2..cols(C)]
> > return(C)
> > }
> >
> >
> > I've never heard of a 'horizontal direct product' but in a 2x2
> > example it seems to be the first and last rows of a conventional
> > Kronecker product:
> >
> > : a
> > 1 2
> > +---------+
> > 1 | 1 2 |
> > 2 | 3 4 |
> > +---------+
> >
> > : b
> > 1 2
> > +---------+
> > 1 | 5 6 |
> > 2 | 0 1 |
> > +---------+
> >
> > : c
> > 1 2 3 4
> > +---------------------+
> > 1 | 5 6 10 12 |
> > 2 | 0 3 0 4 |
> > +---------------------+
> >
> > : a#b
> > 1 2 3 4
> > +---------------------+
> > 1 | 5 6 10 12 |
> > 2 | 0 1 0 2 |
> > 3 | 15 18 20 24 |
> > 4 | 0 3 0 4 |
> > +---------------------+
> >
> >
> > For a 3x3 example, it is the 1st, 5th and 9th rows of the Kronecker
> > product. Thus it appears that whatever this construction might be it
> > could be generated from a Kronecker.
>
>
> *
> * For searches and help try:
> * http://www.stata.com/support/faqs/res/findit.html
> * http://www.stata.com/support/statalist/faq
> * http://www.ats.ucla.edu/stat/stata/
>
--
AbdelRahmen El Lahga
*
* For searches and help try:
* http://www.stata.com/support/faqs/res/findit.html
* http://www.stata.com/support/statalist/faq
* http://www.ats.ucla.edu/stat/stata/