1

X成为一个矩阵ND选择大小n为 by的子矩阵会d返回这些维度的矩阵,除非其中至少有一个nd等于 1,在这种情况下,我们会得到一个向量。有趣的是,即使n和之一d为 0,而另一个不是1,R 仍会返回正确维度的矩阵。

现在,如果我们确定,那么无论是否(这里和)n!=1,执行都会返回一个正确维度的矩阵。如果我们确定这一点,那么我们可以使用. 但是如果两者都可以为 1,那么这两种方法都行不通,因为我们可能会不小心将一行变成一列,反之亦然。cbind(X[row.subset,col.subset])d==1n=length(row.subset)d=length(col.subset)d!=1rbind(...)nd

据我所知,始终获得正确尺寸矩阵的一种方法是调用matrix(X[row.subset,col.subset],nrow=n,ncol=d). 但是,感觉这不应该是正确的方法,而且我不确定没有性能损失。有没有更“原生”的解决方案?

这是一个工作示例:

N <- 6
D <- 3
X <- matrix(rnorm(N*D),ncol=D)

dim(X[1:2,1:2]) #returns 2 2
dim(X[1:2,1]) #returns NULL, this is a vector

dim(cbind(X[1:2,1])) #returns 2 1
dim(cbind(X[1,1:2])) #returns 2 1, but we'd like it to be 1 2

dim(rbind(X[1,1:2])) #returns 1 2
dim(rbind(X[1:2,1])) #returns 1 2, but we'd like it to be 2 1

row.subset <- 1:4
col.subset <- 2
#I _think_ this is always correct, but it's verbose:
matrix(X[row.subset,col.subset],nrow=length(row.subset),ncol=length(col.subset))

提前致谢。

4

1 回答 1

5

如果您不想将矩阵子集简化为向量,请告诉[不要删除维度:

> dim(X[1:2,1, drop=FALSE])
[1] 2 1
> dim(X[1,1:2, drop=FALSE])
[1] 1 2

详情请参阅?"["

于 2013-03-17T03:11:59.300 回答