如何根据2个不同矩阵的元素排序矩阵

时间:2014-07-01 16:42:30

标签: r matrix

我有两个矩阵。一个(每个)是一个排列,另一个矩阵(wh)基于每个矩阵的每个元素包含一些计算。

    > per=permutations(3,3,c(1,2,3))
    > per
         [,1] [,2] [,3]
    [1,]    1    2    3
    [2,]    1    3    2
    [3,]    2    1    3
    [4,]    2    3    1
    [5,]    3    1    2
    [6,]    3    2    1

> wh
     [,1] [,2] [,3]
[1,] "w1" "w2" "w3"
[2,] "w1" "w3" "w2"
[3,] "w2" "w1" "w3"
[4,] "w2" "w3" "w1"
[5,] "w3" "w1" "w2"
[6,] "w3" "w2" "w1"

我想要做的是创建一个新矩阵(whr),它将以w1,w2,w3格式命令矩阵wh

我现在正在做的是,我尝试用for循环填充矩阵。对于第i行,我检测每个矩阵中元素的位置(例如4)并给定此位置,我检测它位于相应的w4的位置,然后相应地填充矩阵。

我正在使用循环

for (i in 1:720){
    whr[i,per[i,1]]=wh[i,1]
    whr[i,per[i,2]]=wh[i,2]
    whr[i,per[i,3]]=wh[i,3]
    whr[i,per[i,4]]=wh[i,4]
    whr[i,per[i,5]]=wh[i,5]
    whr[i,per[i,6]]=wh[i,6]

它完成了这项工作但却非常缓慢。我尝试对它进行矢量化,但我不确定如何。

我给出了一般命令

whr[,per[,1]]=wh[,1]

对所有元素1执行相同操作,因此对2-6执行相同操作但不起作用。 任何建议都更受欢迎。

1 个答案:

答案 0 :(得分:0)

你给我们留下了一些空白来尝试重现你的代码(没有提到包装以及混合3或6)但是假设你想要像

那样的东西
library(gtools)
n   = 3
per = permutations(n, n, 1:n)
wh  = permutations(n, n, paste0("wh", 1:n))
whr = matrix(NA, nrow=factorial(n), ncol=n)
for (i in 1:factorial(n)){ for (j in 1:n){ whr[i,per[i,j]] = wh[i,j] } }

如果你不想在最后一行中使用双循环,那么用下面的代替它会减少到一个循环并产生相同的结果

for (i in 1:factorial(n)){ whr[i,] <- wh[i, order(per[i,])] }