我試圖找到一個算法(不是一個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)
子矩陣。但是這會產生很多重複的矩陣,所以這可能會被優化。
我剛剛編輯的問題包括一個額外的約束:單元格值必須是正整數或空整數,否則會有無數的安排,您的命題確實是唯一有效的答案。 –