I have a matrix (32X48).
How can I convert the matrix into a single dimensional array?
you can use as.vector()
. It looks like it is the fastest method according to my little benchmark, as follows:
library(microbenchmark)
x=matrix(runif(1e4),100,100) # generate a 100x100 matrix
microbenchmark(y<-as.vector(x),y<-x[1:length(x)],y<-array(x),y<-c(x),times=1e4)
The first solution uses as.vector()
, the second uses the fact that a matrix is stored as a contiguous array in memory and length(m)
gives the number of elements in a matrix m
. The third instantiates an array
from x
, and the fourth uses the concatenate function c()
. I also tried unmatrix
from gdata
, but it's too slow to be mentioned here.
Here are some of the numerical results I obtained:
> microbenchmark(
y<-as.vector(x),
y<-x[1:length(x)],
y<-array(x),
y<-c(x),
times=1e4)
Unit: microseconds
expr min lq mean median uq max neval
y <- as.vector(x) 8.251 13.1640 29.02656 14.4865 15.7900 69933.707 10000
y <- x[1:length(x)] 59.709 70.8865 97.45981 73.5775 77.0910 75042.933 10000
y <- array(x) 9.940 15.8895 26.24500 17.2330 18.4705 2106.090 10000
y <- c(x) 22.406 33.8815 47.74805 40.7300 45.5955 1622.115 10000
Flattening a matrix is a common operation in Machine Learning, where a matrix can represent the parameters to learn but one uses an optimization algorithm from a generic library which expects a vector of parameters. So it is common to transform the matrix (or matrices) into such a vector. It's the case with the standard R function optim()
.
Simple and fast since a 1d array is essentially a vector
vector <- array[1:length(array)]
If you instead had a data.frame (df) that had multiple columns and you want to vectorize you can do
as.matrix(df, ncol=1)
array(A)
or array(t(A))
will give you a 1-d array.