[英]R repmat function for sparse matrices
對於我的r項目,我需要重復幾個大的矩陣(即大於1000x1000的矩陣)。 我在r中找到了兩個版本的matlab repmat-function,它們都可以工作,但是有嚴格的限制,因此我無法使用它們。 有沒有人有其他方法來解決這個問題?
為了減少內存使用,我使用了Matrix-Package中的稀疏函數( Diagonal()
, Matrix(..., sparse=TRUE)
)。
> m <- Diagonal(10000)
> object.size(m)
1168 bytes
現在,要重復此矩陣,請使用matlab函數repmat
ar轉換(可以在此處找到):
repmat <- function(X, m, n){
mx <- dim(X)[1]
nx <- dim(X)[2]
return(matrix(t(matrix(X,mx,nx*n)),mx*m,nx*n,byrow=T))
}
不幸的是,此方法使用矩陣的標准/密集版本,並且只能使用特定的對象大小,這在我的項目中很快被超過。 簡單地將matrix(...)
函數與Matrix(..., sparse=TRUE)
交換也不會起作用,因為矩陣維的參數定義不同。
唯一的其他解決方案是pcaMethods-Package的repmat-version,在這里我可以使用稀疏矩陣:
repmat <- function(mat, M, N) {
## Check if all input parameters are correct
if( !all(M > 0, N > 0) ) {
stop("M and N must be > 0")
}
## Convert array to matrix
ma <- mat
if(!is.matrix(mat)) {
ma <- Matrix(mat, nrow=1, sparse=TRUE)
}
rows <- nrow(ma)
cols <- ncol(ma)
replicate <- Matrix(0, rows * M, cols * N, sparse=TRUE)
for (i in 1:M) {
for(j in 1:N) {
start_row <- (i - 1) * rows + 1
end_row <- i * rows
start_col <- (j - 1) * cols + 1
end_col <- j * cols
replicate[start_row:end_row, start_col:end_col] <- ma
}
}
return(replicate)
}
但是,此功能可以完成工作,但是需要大量的運行時間(可能是由於嵌套循環)。 我剩下的唯一選擇是增加整體memory.limit
,但這只會導致物理內存用完。
我的智慧到此為止。 任何幫助或建議,將不勝感激。 預先感謝您的答復。
對rbind
和cbind
使用Matrix方法:
repMat <- function(X, m, n){
Y <- do.call(rbind, rep(list(X), m))
do.call(cbind, rep(list(Y), n))
}
system.time(res <- repMat(m, 20, 30))
#user system elapsed
#0.48 0.44 0.92
str(res)
#Formal class 'dgCMatrix' [package "Matrix"] with 6 slots
# ..@ i : int [1:6000000] 0 10000 20000 30000 40000 50000 60000 70000 80000 90000 ...
# ..@ p : int [1:300001] 0 20 40 60 80 100 120 140 160 180 ...
# ..@ Dim : int [1:2] 200000 300000
# ..@ Dimnames:List of 2
# .. ..$ : NULL
# .. ..$ : NULL
# ..@ x : num [1:6000000] 1 1 1 1 1 1 1 1 1 1 ...
# ..@ factors : list()
object.size(res)
#73201504 bytes
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.