如何找到R中矩阵的所有可能置换?

如何找到R中矩阵的所有可能置换?,r,algorithm,matrix,permutation,R,Algorithm,Matrix,Permutation,我有一个矩阵,例如,5x5 [,1] [,2] [,3] [,4] [,5] [1,] 22 -2 -2 -2 2 [2,] -2 22 2 2 2 [3,] -2 2 22 2 2 [4,] -2 2 2 22 2 [5,] 2 2 2 2 22. 如你所见,矩阵是对称的。 在主对角线上方,有4+3+2+1=10个位置,我通过combn找到所有可能的置换矩

我有一个矩阵,例如,5x5

     [,1] [,2] [,3] [,4] [,5]
[1,]   22   -2   -2   -2    2
[2,]   -2   22    2    2    2
[3,]   -2    2   22    2    2
[4,]   -2    2    2   22    2
[5,]    2    2    2    2   22.
如你所见,矩阵是对称的。 在主对角线上方,有4+3+2+1=10个位置,我通过combn找到所有可能的置换矩阵,在这10个位置上有-23次。那意味着10个/3!*7!=120个矩阵

但其中一些是等效的

所以,我的问题是如何从120中找到非等价矩阵

我在讨论置换矩阵,因为如果我从120个矩阵中选择一个,然后使用rmperm,那么我就得到了120个矩阵中的一个随机矩阵

当我有5x5和6x6矩阵时,我没有问题,因为我已经开发了一个算法。但是现在我想在7x7矩阵和更多矩阵中做同样的事情,但是算法非常慢,因为我有很多循环

所以,我想用一个命令,当我从120个矩阵中选择一个矩阵时,给我120个矩阵中的所有置换矩阵


非常感谢

基本上,您要求所有行/列排列。对于nxn矩阵,有n!行的n阶乘置换和n!列的排列,总共为n^2行/列的总排列不一定都是唯一的

第一步是获取样本数据集,并获取行/列索引的所有排列集,我假设为平方矩阵,但很容易扩展到非平方情况:

# Sample dataset:
library(sna)
set.seed(100)
(g <- rgraph(3))
#      [,1] [,2] [,3]
# [1,]    0    0    1
# [2,]    1    0    0
# [3,]    1    1    0

# All permutations of indices
library(gtools)
(perms <- permutations(nrow(g), nrow(g)))
#      [,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

基本上,您要求所有行/列排列。对于nxn矩阵,有n!行的n阶乘置换和n!列的排列,总共为n^2行/列的总排列不一定都是唯一的

第一步是获取样本数据集,并获取行/列索引的所有排列集,我假设为平方矩阵,但很容易扩展到非平方情况:

# Sample dataset:
library(sna)
set.seed(100)
(g <- rgraph(3))
#      [,1] [,2] [,3]
# [1,]    0    0    1
# [2,]    1    0    0
# [3,]    1    1    0

# All permutations of indices
library(gtools)
(perms <- permutations(nrow(g), nrow(g)))
#      [,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

基本上你想要的是多重集合的排列。包iterpc将完成此工作

> library(iterpc)
> I <- iterpc(c(3,7), ordered=TRUE)
> getlength(I)
[1] 120
> getall(I)
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
  [1,]    1    1    1    2    2    2    2    2    2     2
  [2,]    1    1    2    1    2    2    2    2    2     2
  [3,]    1    1    2    2    1    2    2    2    2     2
  [4,]    1    1    2    2    2    1    2    2    2     2
  [5,]    1    1    2    2    2    2    1    2    2     2
  [6,]    1    1    2    2    2    2    2    1    2     2
  [7,]    1    1    2    2    2    2    2    2    1     2
  [8,]    1    1    2    2    2    2    2    2    2     1
  [9,]    1    2    1    1    2    2    2    2    2     2
 [10,]    1    2    1    2    1    2    2    2    2     2
 [11,]    1    2    1    2    2    1    2    2    2     2
 [12,]    1    2    1    2    2    2    1    2    2     2
 [13,]    1    2    1    2    2    2    2    1    2     2
 [14,]    1    2    1    2    2    2    2    2    1     2
 [15,]    1    2    1    2    2    2    2    2    2     1
 [16,]    1    2    2    1    1    2    2    2    2     2
 [17,]    1    2    2    1    2    1    2    2    2     2
 [18,]    1    2    2    1    2    2    1    2    2     2
 [19,]    1    2    2    1    2    2    2    1    2     2
 [20,]    1    2    2    1    2    2    2    2    1     2
 [ reached getOption("max.print") -- omitted 100 rows ]

这里的每一行都是1和2的排列。你应该用-2代替1。

基本上你想要的是多集的排列。包iterpc将完成此工作

> library(iterpc)
> I <- iterpc(c(3,7), ordered=TRUE)
> getlength(I)
[1] 120
> getall(I)
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
  [1,]    1    1    1    2    2    2    2    2    2     2
  [2,]    1    1    2    1    2    2    2    2    2     2
  [3,]    1    1    2    2    1    2    2    2    2     2
  [4,]    1    1    2    2    2    1    2    2    2     2
  [5,]    1    1    2    2    2    2    1    2    2     2
  [6,]    1    1    2    2    2    2    2    1    2     2
  [7,]    1    1    2    2    2    2    2    2    1     2
  [8,]    1    1    2    2    2    2    2    2    2     1
  [9,]    1    2    1    1    2    2    2    2    2     2
 [10,]    1    2    1    2    1    2    2    2    2     2
 [11,]    1    2    1    2    2    1    2    2    2     2
 [12,]    1    2    1    2    2    2    1    2    2     2
 [13,]    1    2    1    2    2    2    2    1    2     2
 [14,]    1    2    1    2    2    2    2    2    1     2
 [15,]    1    2    1    2    2    2    2    2    2     1
 [16,]    1    2    2    1    1    2    2    2    2     2
 [17,]    1    2    2    1    2    1    2    2    2     2
 [18,]    1    2    2    1    2    2    1    2    2     2
 [19,]    1    2    2    1    2    2    2    1    2     2
 [20,]    1    2    2    1    2    2    2    2    1     2
 [ reached getOption("max.print") -- omitted 100 rows ]

这里的每一行都是1和2的排列。您应该将1替换为-2。

如果如josilber所说,您正在查找所有行和列排列,那就是n^2.对于一个10x10的矩阵,这超过了13万亿个矩阵,这可能太多了,无法先创建然后再挑选出唯一的矩阵。有没有什么对称性或结构可以用来缩小问题?Gregor,我使用的矩阵是对称的。在上面的例子中,在非对角位置只有2个数字-2和2,这是真的吗?例如,如果在这10个位置上有数字1到10,那么就有10个!它们的排列,所有这些都是独一无二的。在上面的例子中,你能说只有120个排列不一定都是唯一的唯一原因是因为你假设只有两个唯一的值,拆分为7/3。正是乔西尔伯!这是真的,我只有2个数字2和-2在非对角位置!基本上你想要的是多重集合的排列。包iterpc将完成这项工作。如果,如josilber所说,您正在寻找所有的行和列排列,那就是n^2.对于一个10x10的矩阵,这超过了13万亿个矩阵,这可能太多了,无法先创建然后再挑选出唯一的矩阵。有没有什么对称性或结构可以用来缩小问题?Gregor,我使用的矩阵是对称的。在上面的例子中,在非对角位置只有2个数字-2和2,这是真的吗?例如,如果在这10个位置上有数字1到10,那么就有10个!它们的排列,所有这些都是独一无二的。在上面的例子中,你能说只有120个排列不一定都是唯一的唯一原因是因为你假设只有两个唯一的值,拆分为7/3。正是乔西尔伯!这是真的,我只有2个数字2和-2在非对角位置!基本上你想要的是多重集合的排列。软件包iterpc将完成这项工作。Josilber,非常感谢,但可能我没有解释清楚。听着,回答我的问题,因为我要编辑它!乔瑟伯,非常感谢,但也许我没有解释清楚。听着,回答我的问题,因为我要编辑它!