我试图找到一个算法(不是一个matlab命令)枚举所有可能的NxM矩阵与约束在每个单元格(或0)中只有正整数和固定的总和为每个行和列(这些是算法的参数)。枚举具有固定行和列总和的矩阵组合
例: 枚举与行中的所有的2x3矩阵总计2,1和列总计0,1,2:
| 0 0 2 | = 2
| 0 1 0 | = 1
0 1 2
| 0 1 1 | = 2
| 0 0 1 | = 1
0 1 2
这是一个相当简单的例子,但作为N和M增加,以及总和,可能有很多的可能性。
编辑1
,我可能有一个有效的安排,以启动算法:
matrix = new Matrix(N, M) // NxM matrix filled with 0s
FOR i FROM 0 TO matrix.rows().count()
FOR j FROM 0 TO matrix.columns().count()
a = target_row_sum[i] - matrix.rows[i].sum()
b = target_column_sum[j] - matrix.columns[j].sum()
matrix[i, j] = min(a, b)
END FOR
END FOR
target_row_sum [I]是在第i行预期的总和。
在上面的例子中给出了第二种安排。
编辑2: (基于j_random_hacker's last statement)
设M是任意矩阵验证在给定条件(行和列总和固定的正或空单元格的值)。 (a,b,c,d)在M中的4个单元格值,其中(a,b)和(c,d)在同一行上,并且(a,c)和(b,d)同一列。 设Xa为包含a的单元格的行号,Ya为列号。
实施例:
| 1 a b |
| 1 2 3 |
| 1 c d |
-> Xa = 0, Ya = 1
-> Xb = 0, Yb = 2
-> Xc = 2, Yc = 1
-> Xd = 2, Yd = 2
下面是一个算法,得到的所有组合验证的初始条件,使只有A,B,C和D变化:
// A matrix array containing a single element, M
// It will be filled with all possible combinations
matrices = [M]
I = min(a, d)
J = min(b, c)
FOR i FROM 1 TO I
tmp_matrix = M
tmp_matrix[Xa, Ya] = a - i
tmp_matrix[Xb, Yb] = b + i
tmp_matrix[Xc, Yc] = c - i
tmp_matrix[Xd, Yd] = d + i
matrices.add(tmp_matrix)
END FOR
FOR j FROM 1 TO J
tmp_matrix = M
tmp_matrix[Xa, Ya] = a + j
tmp_matrix[Xb, Yb] = b - j
tmp_matrix[Xc, Yc] = c + j
tmp_matrix[Xd, Yd] = d - j
matrices.add(tmp_matrix)
END FOR
应该然后可以找到矩阵值的所有可能组合:
- 将算法应用于每个位置的第一个矩阵4组细胞;
- 递归应用算法在前一次迭代获得的每个子矩阵上,对于每个可能的4个单元组,除了父执行中已经使用的任何组以外;
递归深度应该是(N*(N-1)/2)*(M*(M-1)/2)
,每次执行导致((N*(N-1)/2)*(M*(M-1)/2) - depth)*(I+J+1)
子矩阵。但是这会产生很多重复的矩阵,所以这可能会被优化。
我刚刚编辑的问题包括一个额外的约束:单元格值必须是正整数或空整数,否则会有无数的安排,您的命题确实是唯一有效的答案。 –