Mon anglais n'est pas bon, alors veuillez m'excuser si ce que je décris n'est pas clair pour vous.
Je veux créer un tableau à 2 dimensions avec 0et 1 quand j'entre n, il devrait créer: Array01(1 to 2^n as long, n as long), et 0et 1est une combinaison comme ceci:
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 |
Solution du problème
Vous pouvez utiliser une fonction comme ci-dessous
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
et appelle ça comme
' 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
Comment cela marche-t-il?
Si nous regardons la matrice ci-dessous, nous pouvons voir chaque ligne comme un nombre binaire qui peut être converti en un nombre décimal. Donc binaire 000est décimal 0, puis binaire 001est décimal 1et binaire 010est décimal 2et ainsi de suite:
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
Nous savons donc que si nous voulons créer cette matrice, nous devons convertir les nombres décimaux en nombres 1binaires 7. Chacun de ces nombres binaires représente alors une ligne de la matrice.
Puisque le seul nombre pour définir le martix est n(dans l'exemple n = 3), nous pouvons l'utiliser pour calculer les dimensions de la matrice :
- rows :
2 ^ n(dans l'exemple2^3 = 8) - Colonnes:
n
Nous définissons donc une matrice de cette taille ReDim Matrix(1 To 2 ^ n, 1 To n).
Ensuite, nous devons générer les nombres décimaux de 1à 7pour pouvoir les convertir en binaires. Nous faisons cela avec une boucle: For i = 0 To 2 ^ n - 1(dans l'exemple cela signifie For i = 0 To 7).
Dans cette boucle, nous convertissons chaque nombre décimal ien une chaîne binaire de longueur n. Nous le faisons en utilisant BinaryString = DecToBin(i, n).
Enfin, nous avons juste besoin de diviser cette chaîne dans les colonnes de notre matrice. Par conséquent, nous utilisons une autre boucle qui parcourt les caractères de ce BinaryString For c = 1 To n(ce qui signifie commencer par le caractère 1 jusqu'au caractère n). Et remplissez la matrice:
Matrix(i + 1, c) = CLng(Mid$(BinaryString, c, 1))
Ici Mid$(BinaryString, c, 1)sélectionne le caractère de la chaîne et le CLngconvertit en un Longnombre afin qu'il soit numérique et l'écrit dans la position correcte de la matrice Matrix(i + 1, c).
Fanally nous renvoyons cette matrice comme résultat de notre fonction CreateMatrix = Matrix.
Aucun commentaire:
Enregistrer un commentaire