1

抱歉,问题标题含糊不清,我想不出更具体的东西。

我有 3x2 矩阵c

> c
     [,1] [,2]
[1,]    1    2
[2,]    1    3
[3,]    2    3

重要的是ncol(c) == 2

我也有矩阵ind

> ind
      [,1] [2] [,3] [,4]
[1,]    2    2    2    1
[2,]    1    1    2    2
[3,]    2    2    2    1

重要的是nrow(c) == nrow(ind),矩阵的值ind是 1 和 2(就像 c 的每一行的列索引)

我想要得到的是a具有相同暗淡ind的矩阵a[i,j] == c[i,ind[i,j]]

> a
      [,1] [2] [,3] [,4]
[1,]    2    2    2    1
[2,]    1    1    3    3
[3,]    3    3    3    2

我可以在不太全面的情况下做类似的事情,例如,如果nrow(c) == 1我将使用apply

 > apply(c,2,function(x){return(matrix(x[ind], nrow(ind)))})

我知道有一种方法可以使用 mapply 迭代 2 个列表,但是

1)我不知道将矩阵表示为行列表的最佳方法是什么 2)我觉得这个解决方案很难看

实现我在这里描述的最佳方法是什么?

4

2 回答 2

4

矩阵索引来拯救!

> c.mat <- matrix(c(1,1,2,2,3,3), ncol=2)
> ind <- matrix(c(2,1,2,2,1,2,2,2,2,1,2,1), ncol=4)
> matrix(c.mat[cbind(as.vector(row(ind)), as.vector(ind))], ncol=ncol(ind))
     [,1] [,2] [,3] [,4]
[1,]    2    2    2    1
[2,]    1    1    3    3
[3,]    3    3    3    2
于 2012-05-12T21:39:20.623 回答
0
f<-function(x,row1){ 
   for(i in 1:length(x)){
     x[i]=cc[i,ind[i,row1]]
    }
   x
}
a=apply(cc,1,f,nrow(a))

您可以像这样使用应用。注意:cc是你的c matrix

于 2012-05-12T21:58:11.603 回答