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: Passing a subvector to a void function
From
Joe Canner <[email protected]>
To
"[email protected]" <[email protected]>
Subject
RE: st: Passing a subvector to a void function
Date
Mon, 29 Jul 2013 16:06:10 +0000
Sergiy,
Thanks, I figured as much and in the meantime created a temporary variable to pass to the function which I then inserted back into the original vector after the function returned. Although not very elegant, this seemed to work, at least on my test data sets.
I am interested, however, in your reference to Fortran plugins, since I am not 100% confident that my conversion from Fortran to Mata captured the entire essence of what the original Fortran code was meant to accomplish. Can you provide a link to information on how to do what you are suggesting?
Thanks for all your help.
Regards,
Joe
-----Original Message-----
From: [email protected] [mailto:[email protected]] On Behalf Of Sergiy Radyakin
Sent: Monday, July 29, 2013 11:52 AM
To: [email protected]
Subject: Re: st: Passing a subvector to a void function
Joe, I am afraid that's not going to work. Mata passes structures like matrices and vectors as pointers. In the help for pointers the following is applicable (imho) to your case:
---quote1---
You cannot, however, point to the interior of objects. That is, you cannot code p = &X[2,3] and get a pointer that is equivalent to X[2,3] in the sense that if you later coded *p=2, you would see the change reflected in X[2,3].
--- end of quote 1 ---
--- quote 2 ---
The expression is evaluated and the result of the expression stored in a temporary variable. That is why subsequently coding *p=2 does not change X[2,3]. All *p=2 does is change the value of the temporary variable.
-- end quote ---
So in your case the subvector is extracted correctly, stored in a temp var, passed to the function, modified, but then disposed of. Instead I suggest you pass enough information to the procedure being called to be able to restrict the vector to a certain subvector itself and receive a full vector as an argument.
Hope this helps. Note that since you are translating a Fortran code, it might be easier just to create a Fortran plugin. In that case you would only need to access some Stata objects, but keep the main logic.
Best, Sergiy
On Mon, Jul 29, 2013 at 9:31 AM, Joe Canner <[email protected]> wrote:
> Sergiy,
>
> Thanks for looking into this. Sorry, I should have simplified the example before posting. The issue is not whether the subroutine will modify the original vector, the issue is whether you can pass a sub-vector and have it come back modified. To use your suggested code to illustrate:
>
> clear all
> mata
> void arrsum(real rowvector A, real k) { real scalar S, i
> S=0
> for(i=1;i<=cols(A);i++) {
> S=S+A[1,i]
> }
> A[k]=S
> }
>
> A=1,2,3,4
> A
> arrsum(A[|2\.|],1)
> A
> end
>
> So, instead of passing the entire vector A, I am passing a subvector starting with the 2nd element of A. What I expect (and want) is for arrsum to put the sum of elements 2-4 into element 2 (since it arrsum is putting the sum of elements 1-3 of the subvector into element 1 of the subvector). However, if you run this code you will find that A is unmodified upon return.
>
> Regards,
> Joe
>
> -----Original Message-----
> From: [email protected]
> [mailto:[email protected]] On Behalf Of Sergiy
> Radyakin
> Sent: Monday, July 29, 2013 2:56 AM
> To: [email protected]
> Subject: Re: st: Passing a subvector to a void function
>
> Joe, you have too many irrelevant arguments in the procedure you are discussing, they complicate understanding. As to the subject you ask, consider the following example: it computes the sum of the array elements, then replaces the specified element of the array with the computed sum. The modified array is returned to the caller.
> Sergiy
>
> clear all
> mata
> void arrsum(real rowvector A, real k) {
> S=0
> for(i=1;i<=cols(A);i++) {
> S=S+A[1,i]
> }
> A[k]=S
> }
>
> A=1,2,3,4
> A
> arrsum(A,1)
> A
> end
>
> On Fri, Jul 26, 2013 at 12:12 PM, Joe Canner <[email protected]> wrote:
>> A question for all you Mata programmers:
>>
>> I am converting a Fortran 90 program to Mata and the Fortran program passes subarrays as arguments to subroutines like this:
>>
>> call idtang ( ndp, xd, yd, nt, iwk(jwipt), nl, iwk(jwipl),
>> iwk(jwiwl), iwk(jwiwp), wk )
>>
>> where iwk is an array and iwk(jwipt) means "pass a subarray of iwk starting at element jwipt". The subroutine modifies this subarray and passes it back.
>>
>> I converted this to Mata as follows:
>>
>> idtang ( ndp, xd, yd, nt, iwk[|jwipt\.|], nl, iwk[|jwipl\.|],
>> iwk[|jwiwl\.|], iwk[|jwiwp\.|], wk )
>>
>> but iwk is empty upon return.
>>
>> Is there a way to do this that will return the modified subvector and put it back in iwk at position jwipt?
>>
>> I got it to work by creating a new vector ipt, setting it to iwk[|jwipt\.|] and passing it to the function, but I was hoping to avoid having to make so many substantive changes to the original code.
>>
>> Thanks for your help!
>>
>> Joe Canner
>> Johns Hopkins University School of Medicine
>>
>> *
>> * For searches and help try:
>> * http://www.stata.com/help.cgi?search
>> * http://www.stata.com/support/faqs/resources/statalist-faq/
>> * http://www.ats.ucla.edu/stat/stata/
> *
> * For searches and help try:
> * http://www.stata.com/help.cgi?search
> * http://www.stata.com/support/faqs/resources/statalist-faq/
> * http://www.ats.ucla.edu/stat/stata/
>
> *
> * For searches and help try:
> * http://www.stata.com/help.cgi?search
> * http://www.stata.com/support/faqs/resources/statalist-faq/
> * http://www.ats.ucla.edu/stat/stata/
*
* For searches and help try:
* http://www.stata.com/help.cgi?search
* http://www.stata.com/support/faqs/resources/statalist-faq/
* http://www.ats.ucla.edu/stat/stata/
*
* For searches and help try:
* http://www.stata.com/help.cgi?search
* http://www.stata.com/support/faqs/resources/statalist-faq/
* http://www.ats.ucla.edu/stat/stata/