Java 生成具有某些限制的矩阵的所有可能配置
我已经为此奋斗了一段时间,我真的很困惑如何解决这个问题。 我发现了一些可以使用MatLab的东西,但这不是我需要的 以下是我的设想: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
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万个矩阵,我真的很喜欢你的解决方案:)再次感谢!