arrays - 获取 0 和 1 组合的二维数组

标签 arrays excel vba

我的英语不好,所以如果我描述的内容对你来说不清楚,请原谅我。
我想用 0 创建二维数组和 1当我输入 n ,它应该创建:Array01(1 to 2^n as long, n as long) , 和 01是这样的组合:

n = 1 ==> Arr (2 rows x 1 column)
0 |
1 |
n = 2 ==> Arr (4 rows x 2 columns)
0 0 |
0 1 |
1 0 |
1 1 |
n = 3 ==> Array (8 rows x 3 columns)
0 0 0 |
0 0 1 |
0 1 0 |
1 0 0 |
1 1 0 |
1 0 1 |
0 1 1 |
1 1 1 |

最佳答案

您可以使用如下功能

Option Explicit

Public Function CreateMatrix(ByVal n As Long) As Variant
    Dim Matrix() As Long
    ReDim Matrix(1 To 2 ^ n, 1 To n)
    
    Dim i As Long
    For i = 0 To 2 ^ n - 1
        Dim BinaryString As String
        BinaryString = DecToBin(i, n)
        
        Dim c As Long
        For c = 1 To n
            Matrix(i + 1, c) = CLng(Mid$(BinaryString, c, 1))
        Next c
    Next i
    
    CreateMatrix = Matrix
End Function


Public Function DecToBin(ByVal DecimalIn As Variant, Optional ByVal NumberOfBits As Variant) As String
    Dim Result As String
    
    DecimalIn = CDec(DecimalIn)
    
    Do While DecimalIn <> 0
        Result = Trim$(Str$(DecimalIn - 2 * Int(DecimalIn / 2))) & Result
        DecimalIn = Int(DecimalIn / 2)
    Loop
    
    If Not IsMissing(NumberOfBits) Then
        If Len(Result) > NumberOfBits Then
            Result = "Error - Number too large for bit size"
        Else
            Result = Right$(String$(NumberOfBits, "0") & Result, NumberOfBits)
        End If
    End If
    
    DecToBin = Result
End Function
并称它为
' generate the matrix
Dim MyMatrix() As Long
MyMatrix = CreateMatrix(n:=3)

' and write it to a sheet
Worksheets("Sheet1").Range("A1").Resize(UBound(MyMatrix, 1), UBound(MyMatrix, 2)).Value = MyMatrix

这是如何运作的?
如果我们查看下面的矩阵,我们可以将每一行视为可以转换为十进制数的二进制数。所以二进制000是十进制0 , 然后二进制 001是十进制1和二进制 010是十进制2等等:
0 0 0 |  'decimal 0
0 0 1 |  'decimal 1
0 1 0 |  'decimal 2
1 0 0 |  'decimal 3
1 1 0 |  'decimal 4
1 0 1 |  'decimal 5
0 1 1 |  'decimal 6
1 1 1 |  'decimal 7
所以我们知道如果要创建矩阵,我们需要转换十进制数17成二进制数。然后每个二进制数代表矩阵的一行。
因为定义矩阵的唯一数字是n (在示例中 n = 3 )我们可以使用它来计算矩阵的维度:
  • 行:2 ^ n (在示例中 2^3 = 8 )
  • 栏目:n

  • 所以我们定义了一个大小为 ReDim Matrix(1 To 2 ^ n, 1 To n) 的矩阵。 .
    然后我们需要从 1 生成十进制数至7能够将它们转换为二进制文件。我们通过循环来做到这一点:For i = 0 To 2 ^ n - 1 (在示例中,这意味着 For i = 0 To 7 )。
    在那个循环中,我们转换每个十进制数 i变成长度为 n 的二进制字符串.我们使用 BinaryString = DecToBin(i, n) .
    最后,我们只需要将字符串拆分为矩阵的列。因此,我们使用另一个循环遍历该 BinaryString For c = 1 To n 的字符。 (这意味着从字符 1 开始直到字符 n )。并填充矩阵:
    Matrix(i + 1, c) = CLng(Mid$(BinaryString, c, 1))
    
    这里Mid$(BinaryString, c, 1)从字符串中挑选出字符并CLng将其转换为 Long number 所以它是数字并将其写入矩阵的正确位置Matrix(i + 1, c) .
    我们最终返回该矩阵作为函数 CreateMatrix = Matrix 的结果。 .

    关于arrays - 获取 0 和 1 组合的二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68001412/

    相关文章:

    C代码函数调用不起作用

    arrays - 如何获取 MongoDB 聚合管道中不在另一个数组中的数组元素?

    excel - 如何使用 SendKeys 从 DOS 应用程序复制粘贴到 Excel?

    database - 使用ADODB.Connection创建一个SQLite数据库

    vba - 如何使用类模块来设置父变量和子变量?

    c - 在c中实现维特比算法哪种更好?

    arrays - 在 MATLAB 中将函数分布在数组的单个维度上?

    Excel 数据透视表计算字段

    java - Drools - 在决策表中使用 "from"

    python - 有没有办法使用 openpyxl 打印单个单词**粗体**?