From bates at stat.wisc.edu  Fri Oct 23 16:27:01 2009
From: bates at stat.wisc.edu (Douglas Bates)
Date: Fri, 23 Oct 2009 09:27:01 -0500
Subject: [Rd] Confusion regarding allocating Matrices.
In-Reply-To: <40e66e0b0910230723n1cfca327kd8d9ba1127ae46f1@mail.gmail.com>
References: <fc212e850910230639r5038f080hd1aad609064cf5b2@mail.gmail.com>
	<40e66e0b0910230723n1cfca327kd8d9ba1127ae46f1@mail.gmail.com>
Message-ID: <40e66e0b0910230727y4e1c5722p6989ec3e124af534@mail.gmail.com>

On Fri, Oct 23, 2009 at 9:23 AM, Douglas Bates <bates at stat.wisc.edu> wrote:
> On Fri, Oct 23, 2009 at 8:39 AM, Abhijit Bera <abhibera at gmail.com> wrote:
>> Hi
>>
>> I'm having slight confusion.
>
> Indeed.
>
>> I plan to grow/realloc a matrix depending on the data available in a C
>> program.
>
>> Here is what I'm tried to do:
>
>> Data=allocMatrix(REALSXP,3,4);
>> SEXP Data;
>
> Those lines should be in the other order, shouldn't they?
>
> Also, you need to PROTECT Data or bad things will happen.
>
>> REAL(Data)[8]=0.001123;
>> REAL(Data)[200000]=0.001125;
>> printf("%f %f\n\n\n\n",REAL(Data)[8],REAL(Data)[200000]);

And I forgot to mention, it is not a good idea to write REAL(Data)
many times like this.  REAL is a function, not a macro and you are
calling the same function over and over again unnecessarily.  It is
better to write

double *dat = REAL(Data);

and use the dat pointer instead of REAL(Data).

>> Here is my confusion:
>
>> Do I always require to allocate the exact number of data elements in a R
>> Matrix?
>
> Yes.
>
>> In the above code segment I have clearly exceeded the number of
>> elements that have been allocated but my program doesn't crash.
>
> Remember that when programming in C you have a lot of rope with which
> to hang yourself. ? You have corrupted a memory location beyond that
> allocated to the array but nothing bad has happened ?- yet.
>
>> I don't find any specific R functions for reallocation incase my data set
>> grows. How do I reallocate?
>
> You allocate a new matrix, copy the contents of the current matrix to
> the new matrix, then release the old one. ?It gets tricky in that you
> should unprotect the old one and protect the new one but you need to
> watch the order of those operations.
>
> This approach is not a very good one. ?If you really need to grow an
> array it is better to allocate and reallocate the memory within your C
> code using calloc and realloc then, at the end of the calculations,
> allocate an R matrix and copy the results over.
>
> Also, you haven't said whether you are growing the matrix by row or by
> column or both. ?If you are adding rows then you can't just reallocate
> storage because R stores matrices in column-major order. The positions
> of the elements in a matrix with n+1 rows are different from those in
> a matrix with n rows.
>
>> Is it necessary to reallocate or is R handling
>> the memory management for the matrix that I have allocated?
>>
>> Regards
>>
>> Abhijit Bera
>>
>> ? ? ? ?[[alternative HTML version deleted]]
>>
>> ______________________________________________
>> R-devel at r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-devel
>>
>



[Rd] Confusion regarding allocating Matrices.
Douglas Bates