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

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]);

> 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