Câu trả lời:
Đọc nó bằng 'scan', hoặc chỉ làm như.vector () trên ma trận. Bạn có thể muốn chuyển ma trận trước nếu bạn muốn nó theo hàng hoặc cột.
> 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
Nếu chúng ta đang nói về data.frame, thì bạn nên tự hỏi liệu các biến có cùng kiểu không? Nếu đúng như vậy, bạn có thể sử dụng rapply hoặc unlist, vì data.frames là danh sách, nằm sâu trong tâm hồn của chúng ...
data(mtcars)
unlist(mtcars)
rapply(mtcars, c) # completely stupid and pointless, and slower
Từ ?matrix
: "Ma trận là trường hợp đặc biệt của 'mảng' hai chiều." Bạn chỉ có thể thay đổi kích thước của ma trận / mảng.
Elts_int <- as.matrix(tmp_int) # read.table returns a data.frame as Brandon noted
dim(Elts_int) <- (maxrow_int*maxcol_int,1)
bạn có thể sử dụng as.vector()
. Có vẻ như nó là phương pháp nhanh nhất theo điểm chuẩn nhỏ của tôi, như sau:
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)
Giải pháp đầu tiên sử dụng as.vector()
, giải pháp thứ hai sử dụng thực tế là một ma trận được lưu trữ dưới dạng một mảng liền kề trong bộ nhớ và length(m)
cung cấp số phần tử trong ma trận m
. Hàm thứ ba khởi tạo array
từ x
và hàm thứ tư sử dụng hàm nối c()
. Tôi cũng đã thử unmatrix
từ gdata
, nhưng nó quá chậm để được đề cập ở đây.
Dưới đây là một số kết quả số mà tôi thu được:
> 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àm phẳng ma trận là một hoạt động phổ biến trong Học máy, trong đó ma trận có thể đại diện cho các tham số cần tìm hiểu nhưng người ta sử dụng một thuật toán tối ưu hóa từ một thư viện chung mong đợi một vectơ tham số. Vì vậy người ta thường biến ma trận (hoặc các ma trận) thành một vectơ như vậy. Đó là trường hợp của hàm R tiêu chuẩn optim()
.
Bạn có thể sử dụng giải pháp của Joshua nhưng tôi nghĩ bạn cần Elts_int <- as.matrix(tmp_int)
Hoặc cho các vòng lặp:
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 là một vectơ 1d.