GOOGLE ADS

lundi 18 avril 2022

Obtenir un tableau à 2 dimensions avec une combinaison 0 et 1

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'exemple 2^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

Comment utiliseriez-vous .reduce() sur des arguments au lieu d'un tableau ou d'un objet spécifique&nbsp;?

Je veux définir une fonction.flatten qui aplatit plusieurs éléments en un seul tableau. Je sais que ce qui suit n'est pas possible, mais...