如何对从列索引向量中展开压缩稀疏矩阵进行向量化?

3
我希望能够从一个向量构建矩阵,方法如下:如果y的第一个元素是5,我想让矩阵的第一行和第五列为1,行中其它元素都为0。
y=round(runif(30)*9)+1
y_m=matrix(rep(0,length(y)*10),ncol=10)
for (i in 1:length(y)){
  y_m[i,y[i]]=1;
}

有没有避免使用for循环的方法?我试图执行y_m[,y]=1,但显然它不起作用。


2
我认为你的意思是“从列索引向量扩展压缩稀疏矩阵”。 - smci
1
另一种方法:xtabs(rep(1, length(y)) ~ seq_along(y) + y) - alistaire
3个回答

4

是的:使用双列索引矩阵。从?"["

当使用“[”对数组进行索引时,单个参数“i”可以是具有与“x”维度相同数量的列的矩阵;结果是一个向量,其元素对应于“i”每行中的索引集。

设置:

set.seed(101)
y <- round(runif(30)*9)+1

以下是您的方式(我稍微简化了矩阵构建):

y_m <- matrix(0,ncol=10,nrow=length(y))
for (i in 1:length(y)){
  y_m[i,y[i]] <- 1
}

通过矩阵索引:

y_m2 <- matrix(0,ncol=10,nrow=length(y))
y_m2[cbind(1:length(y),y)] <- 1

检查:

all.equal(y_m,y_m2)  ## TRUE

3

您可以使用以下方法:

y_m[cbind(1:length(y), y)] <- 1

由于您有一个稀疏矩阵,您可能想要:
sparse_y_m <- Matrix::sparseMatrix(i = 1:length(y), j = y, x = 1)

如果你需要完整的矩阵,请使用以下方法:

y_m <- as.matrix(sparse_y_m)

2

您可以使用xtabs仅从y创建矩阵,将一个由行数索引的1向量扩展,即seq_along(y)y本身:

xtabs(rep(1, length(y)) ~ seq_along(y) + y)
##             y
## seq_along(y) 1 2 3 4 5 6 7 8 9 10
##           1  0 0 0 1 0 0 0 0 0  0
##           2  0 1 0 0 0 0 0 0 0  0
##           3  1 0 0 0 0 0 0 0 0  0
##           4  0 0 0 0 0 0 1 0 0  0
##           5  0 0 0 1 0 0 0 0 0  0
##           6  0 0 0 1 0 0 0 0 0  0
##           ...

或将其转换为稀疏矩阵:

xtabs(rep(1, length(y)) ~ seq_along(y) + y, sparse = TRUE)
## 30 x 10 sparse Matrix of class "dgCMatrix"
##                       
## 1  . . . 1 . . . . . .
## 2  . 1 . . . . . . . .
## 3  1 . . . . . . . . .
## 4  . . . . . . 1 . . .
## 5  . . . 1 . . . . . .
## 6  . . . 1 . . . . . .
## ...

或者使用数据框架设置它以获得更好的标签:
xtabs(i ~ row + y, data.frame(y, i = 1, row = seq_along(y)))
##     y
## row  1 2 3 4 5 6 7 8 9 10
##   1  0 0 0 1 0 0 0 0 0  0
##   2  0 1 0 0 0 0 0 0 0  0
##   3  1 0 0 0 0 0 0 0 0  0
##   4  0 0 0 0 0 0 1 0 0  0
##   5  0 0 0 1 0 0 0 0 0  0
##   6  0 0 0 1 0 0 0 0 0  0
##   ...

我尝试了 data.matrixmodel.matrix,所以相当接近了...谢谢! - hxd1011

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接