Sorry, I made a mistake while writing the code. The declaration of Data should have been first.
I still have some doubts: When you say calloc and realloc are you talking about R's C interface Calloc and Realloc or the regular calloc and realloc? I want to feed data directly into a R matrix and grow it as required. So at one time I might have 100 rows coming in from a data source. The next time I might have 200 rows coming in from a data source. I want to be able to expand the R-matrix instead of creating a regular C float matrix and then make an R-matrix based on the new size. I just want to have one R object and be able to expand it's size dynamically. I was reading the language specs. It says that one could declare an object in R like this: m=matrix(nrows=10,ncols=10) and then one could assign m[101]=1.00 to expand the object. but this has one problem when I do a dim(m) I get NULL instead of 10 10 So what is happening here? I am aware that R matrices are stored in column major order. Thanks for the tip on using float *dat= REAL(Data); Regards Abhijit Bera On Fri, Oct 23, 2009 at 7:27 PM, Douglas Bates <ba...@stat.wisc.edu> wrote: > On Fri, Oct 23, 2009 at 9:23 AM, Douglas Bates <ba...@stat.wisc.edu> > wrote: > > On Fri, Oct 23, 2009 at 8:39 AM, Abhijit Bera <abhib...@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@r-project.org mailing list > >> https://stat.ethz.ch/mailman/listinfo/r-devel > >> > > > [[alternative HTML version deleted]] ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel