【问题标题】:How to order matrix based on elements of 2 different matrices如何根据 2 个不同矩阵的元素对矩阵进行排序
【发布时间】: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)
  • 非常感谢您的回复。它完全按照我的需要完成工作。

标签: r matrix


【解决方案1】:

你给我们留下了一些空白来尝试重现你的代码(没有提到包以及混淆了 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,])] }

【讨论】:

  • 非常感谢您的回复。它做了我想做的事情,但循环仍然在那里。有没有什么办法可以去掉 for 让代码加快一点?
  • 这取决于您对whper 的实际了解。在您的玩具示例中,有更快的方法,因为whr 的每一行都是相同的,但我假设您正在寻找更通用的东西。
  • 非常感谢您的回复。您可以想象 whr 的元素在每一行都不同。所以你可以有wi1,wi2,wi3,它们不是按顺序排列的。我需要以这样的方式对矩阵进行排序,即对于每个 j,它将以 wj1,wj2,wj3 的形式编写(而不是 wj2,wj1,wj3 假设)
猜你喜欢
  • 2015-10-12
  • 2020-11-04
  • 1970-01-01
  • 2021-06-29
  • 1970-01-01
  • 1970-01-01
  • 2018-04-09
  • 2019-03-28
  • 1970-01-01
相关资源
最近更新 更多