【问题标题】:Best way to generate all 0-1 matrices that are row stochastic with all column sums positive?生成所有行随机且所有列总和为正的所有 0-1 矩阵的最佳方法?
【发布时间】:2020-02-16 13:53:29
【问题描述】:

我正在尝试有效地生成所有 9×3 矩阵的列表,其中每个矩阵都满足以下属性:

  1. 每个条目都是 0 或 1。
  2. 每行总和为 1。
  3. 每一列至少包含一个 1。

我的第一种方法如下:

  1. 生成一个包含所有 0-1 大小为 9×3 的矩阵的列表 A。

     import numpy as np
     import itertools
     n=9
     k=3
     A=[np.reshape(np.array(i), (n,k)) for i in itertools.product([0, 1], repeat = n*k)]
    
  2. 从列表 A 中提取行和为 1 且列中至少包含一个正数项的项:

     matrix_list=[]
     N=len(A)
     for k in range(N):
         B=A[k]
         if (np.sum(B,axis=0)>1).all() and (np.sum(B,axis=1)==1).all():
             matrix_list.append(B)
    

我相信这种方法有效,但效率很低。我是否可以通过考虑如何生成所有可能的矩阵来创建矩阵列表,这些矩阵是由简单矩阵 S 产生的:

    S=np.matrix([[1,0,0],[1,0,0],[1,0,0],[1,0,0],[1,0,0],[1,0,0],[1,0,0],[1,0,0],[1,0,0]])

并创建所有可能的矩阵,这些矩阵由置换每行中的条目产生,不包括列和(无论是第 0 列还是第 1 列)为零的两个矩阵?

【问题讨论】:

    标签: python arrays linear-algebra


    【解决方案1】:

    一位没有关注我的问题的朋友提出了这个建议,这很有效:

        from itertools import combinations
        matrices=[]
        nine=set(range(9))
        for i in range(1,9):
            for combinationI in combinations(nine,i):
                m=[0]*9
                for cI in combinationI:
                    m[cI]=[1,0,0]
                remaining=nine.difference(combinationI)
                for j in range(1,9-i):
                    for combinationJ in combinations(remaining,j):
                        matrix=m[:]
                        for cJ in combinationJ:
                            matrix[cJ]=[0,1,0]
                        r=remaining.difference(set(combinationJ))
                        for cR in r:
                            matrix[cR]=[0,0,1]
                        matrices.append(matrix)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-17
      • 1970-01-01
      • 1970-01-01
      • 2011-07-20
      相关资源
      最近更新 更多