Statalist


[Date Prev][Date Next][Thread Prev][Thread Next][Date index][Thread index]

Re: st: RE: How can I get square roots of elements in a matrix,in Stata8.2?


From   "Xiaoheng Zhang" <zhangx@tcd.ie>
To   statalist@hsphsun2.harvard.edu
Subject   Re: st: RE: How can I get square roots of elements in a matrix,in Stata8.2?
Date   Tue, 28 Aug 2007 14:22:14 +0100

Hi,Nick

Thank you very much for so many solutions.I also produce my own code
to do element-by-element operation with the help of my colleague.It is
the same like what in UCLA's FAQ.The only regrete is that I didn't try
key word "element-by-element" in Google.Cheers!


On 28/08/2007, Nick Cox <n.j.cox@durham.ac.uk> wrote:
> A -search- yields sources of advice:
>
> FAQ     . . . . . . . . . Performing element-by-element operations on matrices
>        . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  A. McDowell
>        4/05    How do I perform element-by-element operations on
>                matrices?
>                http://www.stata.com/support/faqs/data/matrix.html
>
> FAQ     . . . . . . . . . . .  How do I do elementwise operations on a matrix?
>        . . . . . . . . . . . . . . . . . .  UCLA Academic Technology Services
>        10/06   http://www.ats.ucla.edu/stat/stata/faq/elemmatrix.htm
>
> but there is more to be said.
>
> The easiest solution in terms of your typing is to install -matmap- from
> SSC.
>
> matmap A B, map(sqrt(@))
>
> creates B which contains the roots of the elements of A.
>
> This is almost as easy and will develop understanding:
>
> mat B = A
> forval i = 1/`= rowsof(A)' {
>        forval j = 1/`= colsof(A)' {
>                mat B[`i', `j'] = sqrt(A[`i, `j'])
>        }
> }
>
> The UCLA FAQ above does this kind of thing using -while-. That
> is here more cumbersome than using -forval-.
>
> Here is -matmap-.
>
> ---------------------------------------------------
> program define matmap
> *! 1.0.0  NJC 23 August 2000
>        version 6.0
>        gettoken A 0 : 0
>        gettoken B 0 : 0, parse(" ,")
>        syntax , Map(str) [ Symbol(str) ]
>
>        if "`symbol'" == "" { local symbol "@" }
>
>        if !index("`map'","`symbol'") {
>                di in r "map( ) does not contain `symbol'"
>                exit 198
>        }
>
>        local nr = rowsof(matrix(`A'))
>        local nc = colsof(matrix(`A'))
>
>        tempname C val
>        mat `C' = `A'
>
>        local i 1
>        while `i' <= `nr' {
>                local j 1
>                while `j' <= `nc' {
>                        local exp : /*
>                        */ subinstr local map "`symbol'" "`A'[`i',`j']", all
>                        scalar `val' = `exp'
>                        if `val' == . {
>                                di in r "matrix would have missing values"
>                                exit 504
>                        }
>                        mat `C'[`i',`j'] = `val'
>                        local j = `j' + 1
>                }
>                local i = `i' + 1
>        }
>
>        mat `B' = `C' /* allows overwriting of either `A' or `B' */
> end
> --------------------------------------------------
>
> Here is how, 7 years on, I would rewrite it for Stata 8.2 [sic].
> Not tested!
>
> 1. -forval- is nicer than -while-.
> 2. Stata's matrices can now include missing values.
> 3. Some other small changes.
>
> So all the program does is set up two loops over
> the rows and columns and do your stuff elementwise.
>
> ----------------------------------------------- matmap8
> *! 1.1.0  NJC 28 August 2007
> program matmap8
>        version 8.2
>        gettoken A 0 : 0
>        gettoken B 0 : 0, parse(" ,")
>        syntax , Map(str) [ Symbol(str) ]
>
>        if "`symbol'" == "" local symbol "@"
>
>        if !index("`map'","`symbol'") {
>                di as err "map() does not contain `symbol'"
>                exit 198
>        }
>
>        local nr = rowsof(matrix(`A'))
>        local nc = colsof(matrix(`A'))
>        tempname C
>        mat `C' = `A'
>
>        forval i = 1/`nr' {
>                forval j = 1/`nc' {
>                        local exp : /*
>                        */ subinstr local map "`symbol'" "`A'[`i',`j']", all
>                        mat `C'[`i',`j'] = `exp'
>                }
>        }
>
>        mat `B' = `C' /* allows overwriting of either `A' or `B' */
> end
> ------------------------------------------------------
>
> Nick
> n.j.cox@durham.ac.uk
>
> Xiaoheng Zhang
>
> > I am looking for a command or program to transfer a matrix into a new
> > matrix with each element becoming its square root. How can I do this
> > in Stata 8.2?Can I do it in Stata 9.0 with mata?But currently I do not
> > have Stata 9.0.Thank you.
>
> *
> *   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/
>
>


-- 
Greetings,

Xiaoheng Zhang (Kevin)
*
*   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/



© Copyright 1996–2014 StataCorp LP   |   Terms of use   |   Privacy   |   Contact us   |   What's new   |   Site index