多维数组索引改变我的矩阵的值

时间:2013-12-10 04:45:30

标签: arrays r matrix multidimensional-array

我有一个多维数组,里面有13,057个8X11矩阵。

dim(results)
[1] 13057     8    11

每次我索引特定矩阵时,矩阵内的值都会发生变化。例如,我说:

head(results)
[1] 0.2789366 0.1555067 0.3026808 0.1644631 0.2325074 0.3162973

但是当我做的时候

results[1,,]

          [,1]      [,2]      [,3]      [,4]      [,5]      [,6]      [,7]      [,8]      [,9]
[1,] 0.2789366 0.2789366 0.2789366 0.2789366 0.2789366 0.2789366 0.2789366 0.2789366 0.2789366
[2,] 0.1191516 0.1191516 0.1191516 0.1191516 0.1191516 0.1191516 0.1191516 0.1191516 0.1191516
[3,] 0.1805271 0.1805271 0.1805271 0.1805271 0.1805271 0.1805271 0.1805271 0.1805271 0.1805271
[4,] 0.1846702 0.1846702 0.1846702 0.1846702 0.1846702 0.1846702 0.1846702 0.1846702 0.1846702
[5,] 0.4004454 0.4004454 0.4004454 0.4004454 0.4004454 0.4004454 0.4004454 0.4004454 0.4004454
[6,] 0.1336974 0.1336974 0.1336974 0.1336974 0.1336974 0.1336974 0.1336974 0.1336974 0.1336974
[7,] 0.2155045 0.2155045 0.2155045 0.2155045 0.2155045 0.2155045 0.2155045 0.2155045 0.2155045
[8,] 0.5307715 0.5307715 0.5307715 0.5307715 0.5307715 0.5307715 0.5307715 0.5307715 0.5307715

为什么我的所有行都具有相同的值?在我将它放入多维数组之前,这不是这个矩阵的初始值,也不是我在控制台中打印所有矩阵时得到的值。

这是我的代码:

range01 <- function(x){(x-min(x))/(max(x)-min(x))}
results = array(0,dim=c(13057,8,11))

for( i in 1:13057) {
  ap <- as.numeric(unlist(ap.dv[i,1:11]))
  dv <- as.numeric(unlist(ap.dv[i,12:19]))
  m <- outer(ap, dv, FUN="*")
  m[is.na(m)] <- 0
  m <- range01(m)
  results[] <- m
}

感谢。

1 个答案:

答案 0 :(得分:2)

在任何数组或矩阵下,实际上只是一个向量 当你在一个数组上调用head时,你没有找到第一个矩阵的头部,你正在获得向量的头部。看看下面字母的顺序

> LL <- LETTERS[1:24]
> dim(LL) <- c(2, 3, 4)
> head(LL)
[1] "A" "B" "C" "D" "E" "F"

## Have a look at LL: 

> LL
, , 1

     [,1] [,2] [,3]
[1,] "A"  "C"  "E" 
[2,] "B"  "D"  "F" 

, , 2

     [,1] [,2] [,3]
[1,] "G"  "I"  "K" 
[2,] "H"  "J"  "L" 

, , 3

     [,1] [,2] [,3]
[1,] "M"  "O"  "Q" 
[2,] "N"  "P"  "R" 

, , 4

     [,1] [,2] [,3]
[1,] "S"  "U"  "W" 
[2,] "T"  "V"  "X" 

使用上面的LL进行游戏,看看第一个元素,LL[[1]],seoncd,LL[[2]]等。

查看LL[1, , ]LL[, , 1]之间的区别。 您可能认为“第一个矩阵”不一定是R会考虑的内容。


关于为什么你有重复值的问题,答案是你实际上是自己分配这些值。或者更确切地说,您正在分配一个更小(更暗淡)的阵列,而R正在回收。

而不是results[] <- m,请使用results[i, , ] <- m