【发布时间】:2014-07-03 21:01:22
【问题描述】:
我有两个矩阵。一个(per)是一个排列,另一个矩阵(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 的位置,然后我相应地填充矩阵 whr。
我用循环来做这个
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 执行相同的操作,但它不起作用。 任何建议都更受欢迎。
【问题讨论】:
-
你是指矩阵 wh 为 hr 吗?然后你将矩阵 wh 保存为 l?
-
对这个错误表示歉意,非常感谢您的关注。文本现在已编辑。
-
你能根据“per”和“wh”发布想要的“whr”输出吗?您提到 column
i,但您使用i作为循环中的行索引。 -
我不确定它是否正确,但以下看起来是有效的,不是吗?
matrix(t(wh)[order(t(per + (seq_len(nrow(per)) - 1) * ncol(per)))], nrow(wh), ncol(wh), byrow = T) -
非常感谢您的回复。它完全按照我的需要完成工作。