Java 生成具有某些限制的矩阵的所有可能配置

Java 生成具有某些限制的矩阵的所有可能配置,java,matrix,Java,Matrix,我已经为此奋斗了一段时间,我真的很困惑如何解决这个问题。 我发现了一些可以使用MatLab的东西,但这不是我需要的 以下是我的设想: private int[][] c = {{1,1,1,1,1,1,1}, {0,0,0,0,0,0,0}, {0,0,0,0,0,0,0} }; c是一个矩阵,其中每列中只能有一个值设置为1。 这意味着 private int[][] c

我已经为此奋斗了一段时间,我真的很困惑如何解决这个问题。 我发现了一些可以使用MatLab的东西,但这不是我需要的

以下是我的设想:

private int[][] c = {{1,1,1,1,1,1,1},
                     {0,0,0,0,0,0,0},
                     {0,0,0,0,0,0,0}
                    };
c
是一个矩阵,其中每列中只能有一个值设置为1。 这意味着

private int[][] c = {{0,1,0,1,1,0,0},
                     {1,0,0,0,0,1,1},
                     {0,0,1,0,0,0,0}
                    };
是有效的,而

private int[][] c = {{1,0,1,1,0,1,1},
                     {0,0,1,0,0,0,0},
                     {0,0,0,0,1,0,0}
                    };
事实并非如此。 我需要的是生成一个
集合
,其中包含该矩阵的所有有效组合,但我不知道如何开始。 我不知道是不是因为时间晚了,我睡了一半,但我想不出一个好办法


你有什么想法吗?

实际上有很多可能的方法来实现这一点。但是你基本上要从0数到37,然后为每个数字创建一个矩阵

将矩阵的每个可能列想象为一个数字:

1
0 = 0
0

0
1 = 1
0

0
0 = 2
1
然后,矩阵可以用三元形式的数字表示。数字
0000000
将与矩阵相对应

1 1 1 1 1 1 1
0 0 0 0 0 0 0
0 0 0 0 0 0 0
1 1 1 1 1 1 0
0 0 0 0 0 0 1
0 0 0 0 0 0 0
数字
0000001
将与矩阵相对应

1 1 1 1 1 1 1
0 0 0 0 0 0 0
0 0 0 0 0 0 0
1 1 1 1 1 1 0
0 0 0 0 0 0 1
0 0 0 0 0 0 0
等等

然后,您可以计算矩阵的总数,从0开始计算到这个数字,将每个数字转换成3元形式的字符串,并根据这个字符串填充矩阵

895矩阵的编号为
1020011
,这是您的示例矩阵之一:

 0 1 0 1 1 0 0
 1 0 0 0 0 1 1
 0 0 1 0 0 0 0
一个简单的实现:

public class MatrixCombinations
{
    public static void main(String[] args)
    {
        int cols = 7;
        int rows = 3;
        int count = (int)Math.pow(rows, cols);
        for (int i=0; i<count; i++)
        {
            String s = String.format("%"+cols+"s", 
                Integer.toString(i, rows)).replaceAll(" ", "0");
            int[][] matrix = createMatrix(rows, cols, s);
            System.out.println("Matrix "+i+", string "+s);
            printMatrix(matrix);
        }
    }

    private static int[][] createMatrix(int rows, int cols, String s)
    {
        int result[][] = new int[rows][cols];
        for (int c=0; c<cols; c++)
        {
            int r = s.charAt(c) - '0';
            result[r][c] = 1;
        }
        return result;
    }

    private static void printMatrix(int matrix[][])
    {
        for (int r=0; r<matrix.length; r++)
        {
            for (int c=0; c<matrix[r].length; c++)
            {
                System.out.printf("%2d", matrix[r][c]);
            }
            System.out.println();
        }
    }
}
公共类矩阵组合
{
公共静态void main(字符串[]args)
{
int cols=7;
int行=3;
int count=(int)Math.pow(行,列);

对于(int i=0;iMy的想法是将整个矩阵作为一个表示二进制数的数组,但您的解决方案要好得多,谢谢!Queick edit:如果我想更改矩阵的大小呢?更改
cols
值并同时更改
Integer.toString(i,3)中的数字就足够了吗
到相同的值?@StepTNT当然,硬编码的
3
实际上应该是
变量(相应地进行编辑)。然后,您可以简单地更改
/
变量以获得不同的矩阵。这将在其当前形式下最多只能工作10行。但是,通过检查
s.charAt(c)
是数字(
0
..
9
)还是字符,可以轻松地扩展到更多行(
a
z
),并根据需要将其转换为行索引。只要它可以处理10多列,如果需要对其进行一些调整以处理10多行,则不会有问题。我已编辑了您的代码,使其具有多线程功能(我还删除了
println
s)它在我的i5上每秒生成大约250万个矩阵,我真的很喜欢你的解决方案:)再次感谢!