让我解释一下:我data
是一个 5x5 的点网格(所以 n=25)。现在说我要选择J点。我可以combo
使用函数计算出所有可能的组合combn
。但这是一个非常大的矩阵,加上我最终想要实现的目标,我实际上可以通过旋转(90、180、270 度)和反射来定义一个等价类。例如,p1
相当于p2,p3,p4,p5...,p8
data<-expand.grid(1:5,1:5)
J=5 # for example
combo<-combn(25,J)
# rotation symmetry
p1=c(1,6,15,20,25)
p2=c(3,4,5,21,22)
p3=c(1,6,11,20,25)
p4=c(4,5,21,22,23)
# reflection symmetry
p5=c(5,10,11,16,21)
p6=c(1,2,23,24,25)
p7=c(5,10,15,16,21)
p8=c(1,2,3,24,25)
# to help you visualize
par(mfrow=c(4,2))
equiv<-rbind(p1,p2,p3,p4,p5,p6,p7,p8)
fn<-function(x){
p.col=rep(1,25);p.col[x]=2
plot(expand.grid(1:5,1:5),col=p.col,asp=1)}
apply(equiv,1,fn)
在此之后,我可以简单地消除等效行,这样我combo
的矩阵就小得多。所以基本上,我正在寻找一个最终为我提供紧凑版本的脚本combo
。
任何帮助表示赞赏。谢谢。
编辑:我还没有尝试过任何东西。我希望会有一些用于图论/组合学的 R 包来做到这一点。