Hi Jiedei, Thank you for your reply.
To give you a bit more context, I wrote a function that find all the positions (index) of all small matrices inside a larger matrix. At the beginning I pre-allocate let's say a 100 by 2 matrix. However a lot of values might remain empty in this matrix of postions so I have to resize it down to keep only the relevant value. Does it make sense? Please let me know what you think and if there is a safer way to do it? Please let me know if you want more information or have any questions. Best regards Morgan On Sat, 15 Jun 2019 00:15 King Jiefei, <szwj...@gmail.com> wrote: > Hi, > > I don't think there is a native R API to do what you want here, but if the > matrix is only used by you and not be exported to the other user, you can > hack R data structure to achieve that goal. > > Because there is not too much context of your question, I will assume the > whole point of resizing a matrix is to avoid the overhead of memory > allocation, not to represent the same matrix with different dimension since > your 'new' matrix has a different number of elements. > > Roughly speaking, a matrix in R is nothing but a vector with a dim > attribute, you can verify it by R code: > ``` > > A=matrix(1:6,2,3) > > A > [,1] [,2] [,3] > [1,] 1 3 5 > [2,] 2 4 6 > > attributes(A) > $dim > [1] 2 3 > > > attributes(A)=NULL > > A > [1] 1 2 3 4 5 6 > ``` > Therefore, in order to resize the matrix, you need to change the dim > attribute( to a smaller size). Unfortunately, R does its best to prevent > you from doing such dangerous operation( and you should know this is* not > correct!*), you have to go to the C level to hack R internal data > structure. Let's say you want to resize the matrix A to a 2-by-2 matrix, > here is what you need to do: > > C code: > The code sets the second value of the dim attribute to 2. > ``` > // [[Rcpp::export]] > void I_know_it_is_not_correct(SEXP x,SEXP attrName) { > INTEGER(Rf_getAttrib(x, attrName))[1]=2; > } > ``` > > R code: > ``` > > a=matrix(1:6,2,3) > > I_know_it_is_not_correct(a,as.symbol("dim")) > > a > [,1] [,2] > [1,] 1 3 > [2,] 2 4 > > attributes(a) > $dim > [1] 2 2 > ``` > > You get what you want. Please use it with your caution. > > Best, > Jiefei > > > On Fri, Jun 14, 2019 at 2:41 PM Morgan Morgan <morgan.email...@gmail.com> > wrote: > >> 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 >> >> [[alternative HTML version deleted]] >> >> ______________________________________________ >> R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see >> https://stat.ethz.ch/mailman/listinfo/r-help >> PLEASE do read the posting guide >> http://www.R-project.org/posting-guide.html >> and provide commented, minimal, self-contained, reproducible code. >> > [[alternative HTML version deleted]] ______________________________________________ R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.