Wolfram mathematica 在矩阵列表上使用MemberQ

Wolfram mathematica 在矩阵列表上使用MemberQ,wolfram-mathematica,adjacency-matrix,Wolfram Mathematica,Adjacency Matrix,我有一个函数,它的输出是二部图的邻接矩阵列表,我想检查随机生成的矩阵中是否有一个矩阵作为子矩阵 我用于生成矩阵列表的函数是: Krsvariants[r_, s_] := Module[{aa}, aa = Subsets[Range[1, r + s], {r}]; Table[ Table[ If[MemberQ[Tuples[aa[[k]], 2], {i, j}] \[Or] MemberQ[Tuples[Complement[Range[1, r + s

我有一个函数,它的输出是二部图的邻接矩阵列表,我想检查随机生成的矩阵中是否有一个矩阵作为子矩阵

我用于生成矩阵列表的函数是:

Krsvariants[r_, s_] := Module[{aa}, aa = Subsets[Range[1, r + s], {r}];
  Table[
   Table[
    If[MemberQ[Tuples[aa[[k]], 2], {i, j}] \[Or] 
      MemberQ[Tuples[Complement[Range[1, r + s], aa[[k]]], 2], {i,j}], 0, 1], {i, 1, r + s}, {j, 1, r + s}], 
{k, 1, Length[aa]}]]
对于r=2,s=3有输出

{{{0, 0, 1, 1, 1}, {0, 0, 1, 1, 1}, {1, 1, 0, 0, 0}, {1, 1, 0, 0, 
   0}, {1, 1, 0, 0, 0}}, {{0, 1, 0, 1, 1}, {1, 0, 1, 0, 0}, {0, 1, 0, 
   1, 1}, {1, 0, 1, 0, 0}, {1, 0, 1, 0, 0}}, {{0, 1, 1, 0, 1}, {1, 0, 
   0, 1, 0}, {1, 0, 0, 1, 0}, {0, 1, 1, 0, 1}, {1, 0, 0, 1, 0}}, {{0, 
   1, 1, 1, 0}, {1, 0, 0, 0, 1}, {1, 0, 0, 0, 1}, {1, 0, 0, 0, 1}, {0,
    1, 1, 1, 0}}, {{0, 1, 1, 0, 0}, {1, 0, 0, 1, 1}, {1, 0, 0, 1, 
   1}, {0, 1, 1, 0, 0}, {0, 1, 1, 0, 0}}, {{0, 1, 0, 1, 0}, {1, 0, 1, 
   0, 1}, {0, 1, 0, 1, 0}, {1, 0, 1, 0, 1}, {0, 1, 0, 1, 0}}, {{0, 1, 
   0, 0, 1}, {1, 0, 1, 1, 0}, {0, 1, 0, 0, 1}, {0, 1, 0, 0, 1}, {1, 0,
    1, 1, 0}}, {{0, 0, 1, 1, 0}, {0, 0, 1, 1, 0}, {1, 1, 0, 0, 1}, {1,
    1, 0, 0, 1}, {0, 0, 1, 1, 0}}, {{0, 0, 1, 0, 1}, {0, 0, 1, 0, 
   1}, {1, 1, 0, 1, 0}, {0, 0, 1, 0, 1}, {1, 1, 0, 1, 0}}, {{0, 0, 0, 
   1, 1}, {0, 0, 0, 1, 1}, {0, 0, 0, 1, 1}, {1, 1, 1, 0, 0}, {1, 1, 1,
    0, 0}}}
对应于10个不同的矩阵。然后我想检查一个随机矩阵是否至少包含这10个矩阵中的一个,并计算其中的数量

TK23[M_, n_] := Module[{S, k, i},
  S = Subsets[Range[n], {5}];
  Return[Count[
    Table[MemberQ[Krsvariants[2, 3], M[[S[[k]], S[[k]]]]] , {k, 1, 
      Binomial[n, 5]}], True]];]

但当我运行它时,它似乎总是返回零,即使应用于矩阵,它肯定应该包含10中的一个

mmK = Krsvariants[2, 3]
tk23[mM_] := Module[{mS, n},
  n = Length@mM;
  mS = Subsets[Range[n], {5}];
  Total@Table[Count[mmK, mM[[s, s]]], {s, mS}]
  ]
编辑:如果要分别改变行索引和列索引,请使用

Total@Table[Count[mmK, mM[[s1, s2]]], {s1, mS}, {s2, mS}]

我对你的问题描述感到困惑。你为什么不能直接使用
Count
?例如,
mmK=krs变量[2,3];计数[MMK,MMK[[ 1 ] ] < /代码>。我想考虑KRSt变体的所有元素,而不仅仅是它内部的元素,对于这个情况,我想计算KRSt变体的任何元素出现在例如10x10矩阵中的次数:“出现在”中,你的意思是“是子矩阵”吗?或者你真的是说(看起来)可以通过删除10 x 10矩阵中的任何5行和相同的5列来生成?下面的答案假设为后者。很抱歉不清楚。我想要的是,如果以10x10矩阵为例,它会检查10x10中每个可能的5x5子矩阵,并检查它是否匹配任何krs变量,然后计算匹配的总数。在初始代码中,您使用了相同的行和列集(例如,前五行和前五列)。下面我就是这么做的。你现在是说你想让它们独立变化吗?补充。进一步思考后,你得到的第一个表达式是我想要的,但当我在随机图上运行它时,我生成了10个点,边概率为0.6,我总是得到零,对于那些参数,情况不应该是这样,我已经计算了大小为2,3的二部图的预期数量,应该是大约3。代码按照您的要求执行。它很容易测试
mA=ConstantArray[0,10,10}];s=Sort@RandomSample[Range@10, 5]; mA[[s,s]]=mmK[[1]];tk23[mA]