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   "Brian P. Poi" <bpoi@stata.com>
To   statalist@hsphsun2.harvard.edu
Subject   Re: st: Mata void functions and pointers
Date   Thu, 17 May 2012 17:25:59 -0500


On 05/17/2012 04:52 PM, Matthew Baker wrote:
Brendan (and others):

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.

Thanks again!

Matt Baker

Matt,

Here is one solution where I took the liberty of writing a second function that returns a matrix based on the third argument of your example() function:

clear all
mata

void example(A,B,Ab) Ab=J(A+round(3*runiform(1,1)),B,1)

real matrix e2(real scalar A, real scalar B)
{
	real matrix Ab
	example(A,B,Ab)
	return(Ab)
}

void main()
{
	pointer(real matrix) rowvector P
	P = J(3,1,NULL)
	for(i=1;i<=3;++i) {
		P[i] = &(e2(i,i))
	}
	
	for(i=1; i<=3; ++i) {
		P[i]
		*P[i]
	}
}

main()

end


   -- Brian Poi
   -- bpoi@stata.com


*
*   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