我有两个矩阵。一个(每个)是一个排列,另一个矩阵(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执行相同操作但不起作用。 任何建议都更受欢迎。
答案 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,])] }