Réponses:
Soit le lire avec 'scan', soit simplement faire as.vector () sur la matrice. Vous voudrez peut-être d'abord transposer la matrice si vous le souhaitez par lignes ou colonnes.
> m=matrix(1:12,3,4)
> m
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12
> as.vector(m)
[1] 1 2 3 4 5 6 7 8 9 10 11 12
> as.vector(t(m))
[1] 1 4 7 10 2 5 8 11 3 6 9 12
Si nous parlons de data.frame, alors vous devriez vous demander si les variables sont du même type? Si tel est le cas, vous pouvez utiliser rapply, ou unlist, car les data.frames sont des listes, au plus profond de leur âme ...
data(mtcars)
unlist(mtcars)
rapply(mtcars, c) # completely stupid and pointless, and slower
From ?matrix
: "Une matrice est le cas particulier d'un 'tableau' bidimensionnel." Vous pouvez simplement changer les dimensions de la matrice / tableau.
Elts_int <- as.matrix(tmp_int) # read.table returns a data.frame as Brandon noted
dim(Elts_int) <- (maxrow_int*maxcol_int,1)
vous pouvez utiliser as.vector()
. Il semble que ce soit la méthode la plus rapide selon mon petit benchmark, comme suit:
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)
La première solution utilise as.vector()
, la seconde utilise le fait qu'une matrice est stockée sous forme de tableau contigu en mémoire et length(m)
donne le nombre d'éléments dans une matrice m
. Le troisième instancie un array
from x
et le quatrième utilise la fonction de concaténation c()
. J'ai aussi essayé unmatrix
de gdata
, mais c'est trop lent pour être mentionné ici.
Voici quelques-uns des résultats numériques que j'ai obtenus:
> 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
L'aplatissement d'une matrice est une opération courante en Machine Learning, où une matrice peut représenter les paramètres à apprendre mais on utilise un algorithme d'optimisation d'une bibliothèque générique qui attend un vecteur de paramètres. Il est donc courant de transformer la matrice (ou les matrices) en un tel vecteur. C'est le cas de la fonction R standard optim()
.
Vous pouvez utiliser la solution de Joshua mais je pense que vous avez besoin Elts_int <- as.matrix(tmp_int)
Ou pour les boucles:
z <- 1 ## Initialize
counter <- 1 ## Initialize
for(y in 1:48) { ## Assuming 48 columns otherwise, swap 48 and 32
for (x in 1:32) {
z[counter] <- tmp_int[x,y]
counter <- 1 + counter
}
}
z est un vecteur 1d.