当用矩阵索引列矩阵时,如何理解错误“ subscipts out of bound”

问题描述 投票:1回答:2

请考虑以下代码示例:

目标是将mymatrix中的索引替换为mypoints中的相应值。

# example 1--------------------------------------------- 
mymatrix <- c(3,4,1,2, 2,1,4,3, 4,3,2,1)
dim(mymatrix) <- c(4,3)
mypoints <- matrix(c(10, 20, 30, 40), nrow(mymatrix), 1)
# loop
mysummary <- mypoints[mymatrix[,1]]
for (i in 2:ncol(mymatrix) ) {
  mysummary <- cbind(mysummary, mypoints[mymatrix[,i]])
}
# ------------------------------------------------------

结果是:

     mysummary      
[1,]        30 20 40
[2,]        40 10 30
[3,]        10 40 20
[4,]        20 30 10

可以用更简洁的方式替换循环:

> mysummary      <- mypoints[mymatrix]
> dim(mysummary) <- dim(mymatrix)

结果:

     [,1] [,2] [,3]
[1,]   30   20   40
[2,]   40   10   30
[3,]   10   40   20
[4,]   20   30   10

但是,在下面的较小示例中这不起作用:

# example 3---------------------------------------------
> mymatrix <- c(2,1, 2,1)
> dim(mymatrix) <- c(2,2)
> mypoints <- matrix(c(10, 20), nrow(mymatrix), 1)
> mysummary      <- mypoints[mymatrix]
Error in mypoints[mymatrix] : subscript out of bounds

我不知道哪个下标超出范围,在哪个数组中。以及如何防止此错误。

r matrix vectorization subscript
2个回答
0
投票

如果索引矩阵mymatrix有两列,则R假定您要将第一列用作行索引,而第二列用作列索引。因此,由于第二个示例中的mymatrix的第一行是2,2,因此超出了mypoints的范围,因此它失败了。

在您的第一个示例中,mymatrix具有多于2列,因此R将其视为向量,这是在这种情况下有意义的唯一方法。


0
投票

mypoints是一个简并矩阵-它基本上是一个“爆炸”(在其中添加了奇异的第二维)向量。因此,当您尝试在第二维中访问索引2时,它会失败,因为第二维只有索引1。可以进行一些小的修改:

mymatrix <- c(2,1, 2,1)
dim(mymatrix) <- c(2,2)
mypoints <- matrix(c(10, 20), nrow(mymatrix), 2)
mysummary <- mypoints[mymatrix]
© www.soinside.com 2019 - 2024. All rights reserved.