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/