Bookmark and Share

Notice: On April 23, 2014, Statalist moved from an email list to a forum, based at statalist.org.


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: st: Mata void functions and pointers


From   Matthew Baker <[email protected]>
To   [email protected]
Subject   Re: st: Mata void functions and pointers
Date   Thu, 17 May 2012 21:06:32 -0400

Brendan, Jeff, and Brian --

Thanks very much for all your helpful suggestions. I'm glad I asked!

Best,

Matt

On Thu, May 17, 2012 at 6:41 PM, Jeff Pitblado, StataCorp LP
<[email protected]> wrote:
> Matthew Baker <[email protected]> is working with pointers in
> Mata.  Originally he wrote:
>
>> I have a problem in which I am trying to populate the elements of
>> a pointer with the results of a function. The problem is, the function
>> is void and returns its results through an argument, which makes
>> getting results into a pointer nontransparent. As a simple example,
>> consider the following:
>> (example omitted)
>
> Brendan Halpin <[email protected]> replied with a suggestion for Matthew's
> specific, but it did not address Mathew's general need, so Mathew gave us more
> information:
>
>> I should have been more clear! I would certainly prefer to use a
>> vector to collect the elements, but the objects I'm collecting are of
>> unknown dimension which is not known in advance, so perhaps I should
>> have used an example like:
>>
>> /* Begin example */
>> clear all
>> mata
>> void example(A,B,Ab) Ab=J(A+round(3*runiform(1,1)),B,1)
>> P=J(3,1,NULL)
>> for (i=1;i<=3;i++) {
>>       example(i,i,Ab=.)
>>       Ab
>>       P[i]=&Ab
>>                                  }
>>
>> /* display results */
>>
>> for (i=1;i<=3;i++) *P[i]
>> end
>> /* end example */
>>
>> I have thought about trying to readjust the dimensions of the vector
>> every time it is a little different, but this seems kind of clumsy and
>> I was hoping for a better alternative.
>
> Mathew can preallocate each element of the P vector with an address to it's
> own copy of a default Mata object, then pass that object to his 'example()'
> function.  Here is how that would work with Mathew's example above:
>
> ***** BEGIN:
> clear all
> mata:
> void example(A,B,Ab) Ab=J(A+round(3*runiform(1,1)),B,1)
> P=J(3,1,NULL)
> for (i=1;i<=3;i++) {
>        P[i] = &J(0,0,.)                // PREALLOCATION
>        example(i,i,*P[i])
>        *P[i]
> }
>
> /* display results */
>
> for (i=1;i<=3;i++) *P[i]
> end
> ***** END:
>
> --Jeff
> [email protected]
> *
> *   For searches and help try:
> *   http://www.stata.com/help.cgi?search
> *   http://www.stata.com/support/statalist/faq
> *   http://www.ats.ucla.edu/stat/stata/



-- 
Dr. Matthew J. Baker
Department of Economics
Hunter College and the Graduate Center, CUNY

*
*   For searches and help try:
*   http://www.stata.com/help.cgi?search
*   http://www.stata.com/support/statalist/faq
*   http://www.ats.ucla.edu/stat/stata/


© Copyright 1996–2018 StataCorp LLC   |   Terms of use   |   Privacy   |   Contact us   |   Site index