Skip to content

R C API resize matrix

3 messages · Morgan Morgan, Simon Urbanek, Luke Tierney

#
Hi,

Is there a way to resize a matrix defined as follows:

SEXP a = PROTECT(allocMatrix(INTSXP, 10, 2));
int *pa  = INTEGER(a)

To row = 5 and col = 1 or do I have to allocate a second matrix "b" with
pointer *pb and do a "for" loop to transfer the value of a to b?

Thank you
Best regards
Morgan
2 days later
#
Matrix is just a vector with the dim attribute. Assuming it is not referenced by anyone, you can set any values to the dim attribute. As for the vector, you can use SET_LENGTH() to shorten it - but I'm not sure how official it is - it was originally designed to work, but there were abuses of TRUELENGTH so not sure where we stand now (shortened vectors used to fool the garbage collector as far as object sizes go). I wouldn't do it unless you're dealing with rally huge matrices.

Cheers,
Simon
#
On Mon, 17 Jun 2019, Simon Urbanek wrote:

            
Don't do that. SET_LENGTH isn't part of the API and using it outside
specific internal code confuses the garbage collector.

There is support for a growable vector but it's not a at a point where
the interface is stable enough to be used in packages. So again please
don't go there.

Also for a matrix unless you are just dropping trailing columns you
would have to move data in memory.

Best,

luke