计算R中矩阵的永久性

时间:2014-06-11 22:45:31

标签: r matrix permanent

如何在R中找到方形矩阵的永久性(对于一般维数nxn)?特别是,我正在尝试找到独立但不同分布的群体的订单统计数据的pdf,其中包括计算矩阵的永久性,该矩阵的元素是pdfs和原始种群的cdfs

感谢

2 个答案:

答案 0 :(得分:4)

tl; dr 这是一个非平凡的计算问题,似乎并没有在R中实现,并且在计算上足够困难,因此编译的解决方案可能是必要的。最好的办法是编写包含this开源C实现的R代码。

基于the relevant Wikipedia article," Ryser"看起来像是一个很好的搜索术语,用于查找此计算的实现。 library("sos"); findFn("Ryser")仅找到Spearman's rank correlation的帮助,其中包含

  

计算Spearman等级相关统计的精确零分布在n中是指数级的。该包使用预先计算的精确分布,其中n <= 22,使用适用于单项式永久性的Ryser公式获得。

这甚至不是一般性实施,而是一个特例。 Googling "permanent Ryser"在我们开始使用here(即MATLAB代码)之前,我们没有提出任何实现。谷歌搜索&#34;永久的Ryser实施&#34;提出了this CodeProject page,它提供了在相当宽松的Code Project Open License下获得许可的相当简单的C代码。

答案 1 :(得分: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来构造{的项目的索引{1}}:

A

事实上,这些价值都是正面的而且没有减法,这表明了这个&#34;天真&#34;不推荐实施该定义。

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