选择矩阵列(相应的行)作为Nx1(相应的1xD)矩阵,而不是矢量

mar*_*tin 1 r

我们X是一个ND矩阵.选择大小的子矩阵nd返回那些维度的矩阵,除非中的至少一个nd等于1,在这种情况下,我们得到的载体代替.有趣的是,R仍返回正确的尺寸即使一个的矩阵nd是0,并且另一个不是 1.

现在,如果我们确定n!=1,那么执行cbind(X[row.subset,col.subset])将返回正确维度的矩阵,无论是否d==1(此处n=length(row.subset)d=length(col.subset)).如果我们确定d!=1,那么我们就可以使用rbind(...).但是,如果双方nd可以是1,两个策略都不成功,因为我们可能会意外地把行插入列,反之亦然.

据我所知,总是得到正确尺寸矩阵的一种方法是调用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))
Run Code Online (Sandbox Code Playgroud)

提前致谢.

Ist*_*sta 5

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

> dim(X[1:2,1, drop=FALSE])
[1] 2 1
> dim(X[1,1:2, drop=FALSE])
[1] 1 2
Run Code Online (Sandbox Code Playgroud)

详情?"["请见.