Matrix F#:二维数组-生成所有可能的二进制组合
您将使用什么方法生成仅包含0和1的NxN矩阵集,这些矩阵表示所有可能的不同组合Matrix F#:二维数组-生成所有可能的二进制组合,matrix,f#,permutation,Matrix,F#,Permutation,您将使用什么方法生成仅包含0和1的NxN矩阵集,这些矩阵表示所有可能的不同组合 let matrix Array2D.init N N (fun x y -> something) 如果您不知道F#,那么伪代码也将是一种贡献 所以我想要的是所有不同矩阵组合的列表/数组 let rec addOne (N1: int, N2: int) (M: int[,]) (i: int, j: int)= if M.[i,j] = 0 then M.[i,j] <- 1
let matrix Array2D.init N N (fun x y -> something)
如果您不知道F#,那么伪代码也将是一种贡献
所以我想要的是所有不同矩阵组合的列表/数组
let rec addOne (N1: int, N2: int) (M: int[,]) (i: int, j: int)=
if M.[i,j] = 0
then M.[i,j] <- 1
true
else M.[i,j] <- 0
let newi, newj =
if i < N1-1
then (i+1,j)
else (0,j+1)
if newj = N2
then false
else addOne (N1, N2) M (newi,newj)
我不知道这是否有意义。
这是一种找到“下一个”矩阵的方法,然后列出我们以这种方式遇到的所有矩阵
编辑:用int(0和1)替换bool以更好地拟合原始问题。因此,我认为最难的部分是生成元素列表。我们可以递归地做 基本情况很简单。对于1x1矩阵,有一个元素只能有两种组合:
[|[|[| 0 |];[| 1 |]|]
对于2x2元素,我们有2^2=4个元素。其中的每一个都可以是1或0,因此有2^4=16个可能的组合。要获得该2x2数组的所有可能组合,我们可以将其视为长度为4的数组
但首先,让我们考虑一个长度为2的数组。然后我们必须找到[|[| 0 |][| 1 |][124;]
和[|[| 0 |][| 1 |]
之间的所有组合。这将是[|[| 0;0 |][| 0;1 |][| 1;0 |][| 1;1 |]
。幸运的是,有一个名为Array.allPairs
的函数,它将生成两个数组之间所有可能组合的数组,这已经为我们实现了
因此,我们可以将Array.allPairs
按顺序应用于长度为4的数组中的每个元素,以使用Array.reduce获得整个矩阵的所有可能组合。我创建了一个名为pairsToArray
的函数,基本上使数据结构平坦化
let pairsToArray x = Array.concat [|fst x; snd x|]
let rec binary N =
match N with
| 0 -> [||]
| 1 -> [|[|0|]; [|1|]|]
| n -> let elements = n*n
let combinations = Array.init elements (fun i -> binary 1)
let result = Array.reduce (fun acc i -> Array.allPairs acc i |> Array.map pairsToArray) combinations
result
现在,剩下的就是将其转换为Array2D
。
像这样的东西应该会起作用
let c = binary 2
c |> Array.map (fun i -> Array2D.init 2 2 (fun j k -> i.[j+k*2]))
对于2x2案例“所有可能的不同组合”是什么?我不明白你在找什么。也许你可以给出一个3x3或4x4矩阵的例子,显示你想要得到的结果;这样可以更清楚地回答你的问题。假设你有一个由2个元素组成的数组。对于二进制输入,有4种不同的组合。[1,1] [1,0] [0,1] [0,0]. 现在考虑NXN矩阵RIXSO,在2x2矩阵中的每个时隙中,你需要一个列表,比如[1;1 ],或者[0;1 ]等等。好的,但是3x3矩阵呢。三个二进制数字(000到111)有八种组合,但在3x3矩阵中有九个位置。我可以看到用三个二进制数字的八个组合中的一个填充九个位置中的八个,但是第九个插槽中有什么?
let c = binary 2
c |> Array.map (fun i -> Array2D.init 2 2 (fun j k -> i.[j+k*2]))