Steven Dirkse
2011-Nov-01 20:29 UTC
[Rd] reducing a too-large matrix obtained with allocMatrix()
Hello, I have some C code (for a shared lib called via .External) that uses PROTECT(w= allocMatrix(REALSXP, m, n)); mostly successfully. In rare cases, though, the row count m will be an overestimate. Is there a way to reallocate the matrix in-place, something like reAllocMatrix (w,m-excess,n) /* where excess is > 0 */ to chop off the last excess rows of w? I only find out about the excess rows during the single pass over the data made to copy it from its source to w. Short of this, all I know to do is allocate a matrix of the proper size and copy the values. Any other ways to do this? -- Steve Dirkse
Simon Urbanek
2011-Nov-02 01:14 UTC
[Rd] reducing a too-large matrix obtained with allocMatrix()
On Nov 1, 2011, at 4:29 PM, Steven Dirkse wrote:> Hello, > > I have some C code (for a shared lib called via .External) that uses > > PROTECT(w= allocMatrix(REALSXP, m, n)); > > mostly successfully. In rare cases, though, the row count m will be > an overestimate. Is there a way to reallocate the matrix in-place, > something like > > reAllocMatrix (w,m-excess,n) /* where excess is > 0 */ > > to chop off the last excess rows of w? I only find out about the > excess rows during the single pass over the data made to copy it from > its source to w. > > Short of this, all I know to do is allocate a matrix of the proper > size and copy the values. Any other ways to do this? >No. In theory you could use SETLENGTH, and then adjust the dimensions, but since you are talking about rows you'll need to re-arrange the whole matrix anyway so you would a) waste memory in the result and b) still need to essentially copy in place in an additional pass. Cheers, Simon