排列 R 中向量的所有唯一枚举

2024-04-01

我试图找到一个函数来排列所有unique向量的排列,而不计算相同元素类型子集中的并置。例如:

dat <- c(1,0,3,4,1,0,0,3,0,4)

has

factorial(10)
> 3628800

可能的排列,但仅10!/(2!*2!*4!*2!)

factorial(10)/(factorial(2)*factorial(2)*factorial(2)*factorial(4))
> 18900

忽略相同元素类型子集中的并置时的独特排列。

我可以通过使用得到这个unique()permn()包中的函数combinat

unique( permn(dat) )

但这在计算上非常昂贵,因为它涉及枚举n!,这可能比我需要的排列多一个数量级。有没有一种方法可以在不首先计算的情况下做到这一点n!?


编辑:这是一个更快的答案;再次基于 Louisa Gray 和 Bryce Wagner 的想法,但由于更好地使用了矩阵索引,R 代码更快。它比我原来的要快很多:

> ddd <- c(1,0,3,4,1,0,0,3,0,4)
> system.time(up1 <- uniqueperm(d))
   user  system elapsed 
  0.183   0.000   0.186 
> system.time(up2 <- uniqueperm2(d))
   user  system elapsed 
  0.037   0.000   0.038 

和代码:

uniqueperm2 <- function(d) {
  dat <- factor(d)
  N <- length(dat)
  n <- tabulate(dat)
  ng <- length(n)
  if(ng==1) return(d)
  a <- N-c(0,cumsum(n))[-(ng+1)]
  foo <- lapply(1:ng, function(i) matrix(combn(a[i],n[i]),nrow=n[i]))
  out <- matrix(NA, nrow=N, ncol=prod(sapply(foo, ncol)))
  xxx <- c(0,cumsum(sapply(foo, nrow)))
  xxx <- cbind(xxx[-length(xxx)]+1, xxx[-1])
  miss <- matrix(1:N,ncol=1)
  for(i in seq_len(length(foo)-1)) {
    l1 <- foo[[i]]
    nn <- ncol(miss)
    miss <- matrix(rep(miss, ncol(l1)), nrow=nrow(miss))
    k <- (rep(0:(ncol(miss)-1), each=nrow(l1)))*nrow(miss) + 
               l1[,rep(1:ncol(l1), each=nn)]
    out[xxx[i,1]:xxx[i,2],] <- matrix(miss[k], ncol=ncol(miss))
    miss <- matrix(miss[-k], ncol=ncol(miss))
  }
  k <- length(foo)
  out[xxx[k,1]:xxx[k,2],] <- miss
  out <- out[rank(as.numeric(dat), ties="first"),]
  foo <- cbind(as.vector(out), as.vector(col(out)))
  out[foo] <- d
  t(out)
}

它不会返回相同的顺序,但排序后,结果是相同的。

up1a <- up1[do.call(order, as.data.frame(up1)),]
up2a <- up2[do.call(order, as.data.frame(up2)),]
identical(up1a, up2a)

对于我的第一次尝试,请参阅编辑历史记录。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

排列 R 中向量的所有唯一枚举 的相关文章

随机推荐

  • 如何在角度单元测试中模拟 location.path

    http blog artlogic com 2013 05 06 angularjs best practices ive been doing it wrong part 2 of 3 http blog artlogic com 20
  • Windows 上的 Qt QMYSQL“驱动程序未加载”

    当尝试连接到 mysql 数据库时 我收到以下错误 驱动程序未加载 我已经创建了一个安装程序 其中包含所有需要的 DLL 文件 libmysql dll plugins qsqlmysql dll QT5Sql 等 在新安装的 Window
  • 如何从 1 更新 id 集?

    我有一个id即主键和自增 是否有任何疑问可以更新我现有的id并让我的id从 1 开始 下一个 id 2 等等 例如 id name 3 ABC 5 XYZ 9 PQR NOTE id已经是主要的并且自动增量 我不想截断我的 id 如果可能的
  • Python multiprocessing.Pool map()“TypeError:字符串索引必须是整数,而不是 str”

    我正在尝试使用 multiprocessing Pool 对字典列表进行并行处理 下面是一个例子 请注意 这是一个玩具示例 我的实际示例将对实际字典中的值进行 CPU 密集型处理 import multiprocessing my list
  • 可以在 VS2008 中的预处理器指令块(例如 #ifndef ... #endif)中启用智能感知吗?

    在 C 库中工作时 我注意到在 ifndef CLIENT DLL endif 等指令块内我没有被授予任何智能感知 这显然是由于 CLIENT DLL 已被定义的事实 我意识到我可以通过简单地注释掉指令来解决这个问题 无论指令评估如何 是否
  • Netbeans:将 Java 应用程序部署到远程 Tomcat

    有没有简单的方法可以自动将Web服务 Java Web应用程序等部署到远程tomcat服务器 目前我必须手动复制 war 文件 就我个人而言 我在 build xml 中添加了一个 deploy 目标 其中包含一个 标签来传输 war 文件
  • WPF DataTrigger 值中的绑定

    嗯 这可能是一个简单的问题 但我无法找到解决方案 我有一个DataTrigger as
  • 使用xarray,如何在多维数据集上并行化一维操作?

    我有一个 4D xarray 数据集 我想在特定维度 此处为时间 上的两个变量之间进行线性回归 并将回归参数保留在 3D 数组中 其余维度 我设法通过使用此串行代码获得了我想要的结果 但速度相当慢 add empty arrays to s
  • 在图形工具、Python 界面中从邻接矩阵创建加权图

    我应该如何使用 python 中的图形工具从邻接矩阵中创建图形 假设我们有adj矩阵作为邻接矩阵 我现在做的是这样的 g graph tool Graph directed False g add vertex len adj edge w
  • XML 解析以获取描述选项卡

    我如何使用 android 中的 xml 解析来解析描述详细信息
  • Windows 7 上的 GetWindowRect 太小

    我想要解决的实际问题是 我想自动找出窗口周围边距的大小 如果您能找到更好的方法 请务必回答这个而不是这个 为此 我决定截取测试窗口的屏幕截图并测量边距 这很简单 因为我预计任何边距都不会是亮粉色 但我承认这是一个黑客行为 我用获取窗口矩形
  • Go-复制结构之间的所有公共字段

    我有一个存储 JSON 的数据库 以及一个提供外部 API 的服务器 通过 HTTP post 可以更改该数据库中的值 该数据库由不同的进程在内部使用 因此具有通用的命名方案 客户看到的密钥不同 但与数据库中的密钥进行 1 1 映射 存在未
  • 使用 Parse 创建 Stripe 客户

    我正在尝试使用解析创建一个条带客户 但似乎无法从响应中获取 customer id 值 var newCustomer Stripe Customers create card request params cardToken email
  • Objective-c:访问方法中的可变参数[重复]

    这个问题在这里已经有答案了 可能的重复 如何在 Objective C 中创建可变参数方法 https stackoverflow com questions 4804674 how to create variable argument
  • 紧凑的等于和哈希码

    我有一个有 4 个属性的 bean user institutionId groupId postingDate 我使用 Eclipse 生成 equals 和 hashcode 但生成的代码不太漂亮 有没有一种紧凑的方法可以做到同样的事情
  • 将ELF文件加载到内存中

    我正在尝试将 elf 文件放入内存然后执行它 步骤如下 1 要放入内存的文件 int main printf Hello world n return 0 2 编译它gcc o hello hello c static ELF Header
  • 如何锁定 Django 中的关键部分?

    我找不到一个好的干净方法来锁定 Django 中的关键部分 我可以使用锁或信号量 但 python 实现仅适用于线程 因此如果生产服务器分叉 那么这些将不会受到尊重 有谁知道一种方法 我现在正在考虑 posix 信号量 来保证跨进程的锁定
  • Docker Weave 和 WeaveDNS 问题

    我在本地计算机上运行的小型 weave 网络上设置 weaveDNS 时遇到问题 目前 问题表现为以下事实 当我运行 weave status 时 我在输出中没有看到 DNS 部分 如故障排除部分中所建议的那样 http docs weav
  • 如何正确使用倒计时线程,如何提前停止它?

    线程没有按我期望的方式工作 我有一个可行的解决方案 可以使用 Raspberry Pi 和簧片开关监控冰箱何时打开和关闭 声音播放未暂停和暂停 我现在想添加一个计时器 以便在门打开时间过长时执行某些操作 我认为启动一个在警报操作之前休眠 x
  • 排列 R 中向量的所有唯一枚举

    我试图找到一个函数来排列所有unique向量的排列 而不计算相同元素类型子集中的并置 例如 dat lt c 1 0 3 4 1 0 0 3 0 4 has factorial 10 gt 3628800 可能的排列 但仅10 2 2 4