【问题标题】:Calculate permanent of a matrix in R计算R中矩阵的永久值
【发布时间】:2014-08-02 03:44:08
【问题描述】:

如何在 R 中找到方阵的永久值(对于一般维度 nxn)?特别是,我正在尝试为独立但非相同分布的人口找到一个顺序统计的 pdf,其中包括计算一个矩阵的永久值,该矩阵的元素是原始人口的 pdfs 和 cdfs

谢谢

【问题讨论】:

  • 对于我们这些背景不足的人,您想解释一下什么是“永久”。 (我想知道您是否打算写“行列式”,在这种情况下,您可能想删除此问题并使用 R 中的标准 ??-facilities 进行搜索。)
  • 它基本上就像行列式,但每个术语都带有一个+号
  • @BondedDust 的蛮力解决方案是否足够,或者您是否需要在 R 中实现 Ryser 的算法,或者包装一个 C 实现(以及您是否需要修改下面指出的 C 实现)将取决于您的矩阵有多大以及它们是整数还是浮点数...

标签: r matrix permanent


【解决方案1】:

tl;dr 这是一个重要的计算问题,似乎没有在 R 中实现,并且计算难度很大,可能需要编译解决方案。最好的办法是编写 R 代码包装 this 开源 C 实现。

基于the relevant Wikipedia article,“Ryser”看起来是一个很好的搜索词,可用于查找此计算的实现。 library("sos"); findFn("Ryser") 只找到Spearman's rank correlation 的帮助,上面写着

Spearman 等级相关统计量的精确零分布的计算在 n 中呈指数级困难。这个包使用预先计算的 n

这甚至不是一般的实现,而是一种特殊情况。 Googling "permanent Ryser" 直到我们深入到 here(这是 MATLAB 代码)才提出任何实现。谷歌搜索“永久 Ryser 实现”得到 this CodeProject page,它提供了相当简单的 C 代码,在相当宽松的 Code Project Open License 下获得许可。

【讨论】:

    【解决方案2】:

    matrix(1:9, 3) 的永久地址将是:

     install.packages("permute"); library(permute)
      A<-matrix(1:9, 3)
    
      # Error: sum( apply( allPerms(1:3), 1, function(r) prod( A[1:3, r]) )  )
    

    allPerms 函数似乎遗漏了原始向量,因此需要 Ben Bolker 的一项更正,我应该使用 cbind 来构建 A 项目的索引:

    sum( apply( rbind(1:3,allPerms(1:3)), 1,
                                   function(r) prod( A[cbind(1:3, r)]) ) )
    

    这些值都是正数并且没有减法这一事实表明了为什么不推荐这种“幼稚”的定义实现的原因。

     A <- matrix(1:16,4)    
     sum( apply( rbind(1:4,allPerms(1:4)), 1, 
                           function(r) prod( A[cbind(1:4, r)]) ) )
    #[1] 55456
    

    【讨论】:

    • 基于维基百科页面我认为正确的答案是1*5*9+3*4*8+2*6*7+3*5*7+6*8*1+2*4*9=450?
    • 那我想我误解了下标?或者 Gavin 的代码没有提供正确数量的三个项目的排列。你有 6 个,我有 5 个。(现在我想知道为什么没有 6 个......)
    • 嗯 ... 更正:sum( apply( rbind(1:3,allPerms(1:3)), 1, function(r) prod( A[cbind(1:3, r)]) ) ) 给出 450。(allPerms 不包括原始向量,并且下标不同。)
    猜你喜欢
    • 2019-06-12
    • 1970-01-01
    • 1970-01-01
    • 2018-09-03
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多