2017-11-22 8 views
0

Iがゼロに初期化対称スパース行列を有するのマトリックスによって、スパース行列を移入します別のマトリックス(val.mat)によって与えられた値で満たされる必要があります:idx.matとに応じmat移入するより高速な方法があるかどうはインデックス

idx.mat <- do.call(rbind,lapply(1:5,function(i) sample(1:5,3,replace=F))) 
val.mat <- matrix(runif(15,1,10),5,3) 

は、だから私は思ったんだけどより0:

idx = cbind(rep(1:nrow(idx.mat), ncol(idx.mat)), c(idx.mat)) 

そして索引にその行列を使用することができるだけ割り当てる:

mat <- do.call(rbind,lapply(1:nrow(mat),function(i) { 
    mat[i,idx.mat[i,]] <- val.mat[i,] 
    return(mat[i,]) 
})) 

答えて

1

良い方法は、2つの列が行に対応する行列と列のインデックスを率nxにあなたidx.matを変換することです:

mat[idx] = c(val.mat) 
mat 
# 5 x 5 sparse Matrix of class "dgCMatrix" 
#             
# [1,] .  5.479293 .  4.475027 9.412347 
# [2,] 2.909283 .  1.120513 .  7.458567 
# [3,] .  4.441492 6.865064 .  9.927155 
# [4,] 4.420317 .  .  8.827218 2.129996 
# [5,] .  3.404986 4.063141 7.997007 . 
1

sparseMatrixを最初から定義して宣言することもできます。

# Index/value dataframe 
df.idx <- cbind.data.frame(
    melt(idx.mat)[, -2], 
    melt(val.mat)[, "value"]); 
names(df.idx) <- c("i", "j", "x"); 

# Declare and define sparseMatrix 
mat <- sparseMatrix(i = df.idx$i, j = df.idx$j, x = df.idx$x); 
mat; 
#5 x 5 sparse Matrix of class "dgCMatrix" 
# 
#[1,] .  5.479293 .  4.475027 9.412347 
#[2,] 2.909283 .  1.120513 .  7.458567 
#[3,] .  4.441492 6.865064 .  9.927155 
#[4,] 4.420317 .  .  8.827218 2.129996 
#[5,] .  3.404986 4.063141 7.997007 .  

それともmelt + df.idx迂回なし:

i <- rep(seq(1:nrow(idx.mat)), ncol(idx.mat)); 
j <- c(idx.mat); 
x <- c(val.mat); 
mat <- sparseMatrix(i = i, j = j, x = x); 

#5 x 5 sparse Matrix of class "dgCMatrix" 
# 
#[1,] .  5.479293 .  4.475027 9.412347 
#[2,] 2.909283 .  1.120513 .  7.458567 
#[3,] .  4.441492 6.865064 .  9.927155 
#[4,] 4.420317 .  .  8.827218 2.129996 
#[5,] .  3.404986 4.063141 7.997007 . 
関連する問題