如何理解错误"subscipts out of bound",用矩阵索引列矩阵时
How to understand the error "subscipts out of bound", when indexing a column matrix with a matrix
考虑以下代码示例:
objective是将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
不知道哪个下标越界,在哪个数组中。以及如何防止这个错误。
mypoints
是一个退化矩阵——它基本上是一个 "blown-up"(其中添加了一个奇异的第二维)向量。因此,当您尝试访问第二个维度中的索引 2 时,它会失败,因为第二个维度只有索引 1。一个小的修改有效:
mymatrix <- c(2,1, 2,1)
dim(mymatrix) <- c(2,2)
mypoints <- matrix(c(10, 20), nrow(mymatrix), 2)
mysummary <- mypoints[mymatrix]
如果索引矩阵mymatrix
有两列,那么R假设你想使用第一列作为行索引,第二列作为列索引。所以它失败了,因为在你的第二个例子中 mymatrix
的第一行是 2,2
,它在 mypoints
中超出了范围。
在您的第一个示例中,mymatrix
有超过 2 列,因此 R 将其视为向量,这是在这种情况下唯一有意义的方式。
考虑以下代码示例:
objective是将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
不知道哪个下标越界,在哪个数组中。以及如何防止这个错误。
mypoints
是一个退化矩阵——它基本上是一个 "blown-up"(其中添加了一个奇异的第二维)向量。因此,当您尝试访问第二个维度中的索引 2 时,它会失败,因为第二个维度只有索引 1。一个小的修改有效:
mymatrix <- c(2,1, 2,1)
dim(mymatrix) <- c(2,2)
mypoints <- matrix(c(10, 20), nrow(mymatrix), 2)
mysummary <- mypoints[mymatrix]
如果索引矩阵mymatrix
有两列,那么R假设你想使用第一列作为行索引,第二列作为列索引。所以它失败了,因为在你的第二个例子中 mymatrix
的第一行是 2,2
,它在 mypoints
中超出了范围。
在您的第一个示例中,mymatrix
有超过 2 列,因此 R 将其视为向量,这是在这种情况下唯一有意义的方式。