3 votes

vb.net - Insérer des tableaux à 1 dimension dans un tableau à 2 dimensions

Je travaille sur un algorithme d'optimisation et j'ai besoin de stocker certaines données (générées par l'algorithme) dans un tableau à deux dimensions appelé matrix où la ligne (i) contient le score d'aptitude et les valeurs des paramètres du vecteur d'optimisation (i).

Dim matrix(vectorCount() - 1, parameterCount()) As Double
Dim params(parameterCount() - 1) As Double

For i As Integer = 0 To vectorCount() - 1
    matrix(i, 0) = vectorScore(i)
    params = vectorValues(i)
    For j As Integer = 0 To params.Length - 1
        matrix(i, j+1) = params(j)
    Next
Next

int vectorCount() renvoie le nombre de vecteurs.
int parameterCount() renvoie le nombre de paramètres dans chaque vecteur.
double vectorScore( int vectorIndex) renvoie le score d'aptitude d'un vecteur spécifié.
double[] vectorValues( int vectorIndex) renvoie les valeurs des paramètres d'un vecteur spécifié.

Ma question :
Existe-t-il un moyen plus rapide (c'est-à-dire plus efficace) d'insérer des params en matrix ?

4voto

varocarbas Points 9981

Si vous recherchez l'efficacité, les tableaux "simples" constituent sans aucun doute la meilleure option. La raison pour laquelle ils sont si efficaces par rapport à d'autres solutions (collections, listes, etc.) est qu'ils contiennent le minimum d'informations nécessaires. Si vous voulez des fonctions fantaisistes permettant de trier les informations facilement/rapidement ou d'écrire des requêtes complexes pour récupérer les données, vous ne devriez pas compter sur les tableaux.

Je me fie toujours à un code comme celui que vous avez écrit et je n'ai jamais eu de problème de vitesse (c'est vraiment rapide). J'ai fait une recherche rapide pour m'assurer qu'il n'y avait pas d'autre option, mais je n'en ai pas trouvé. La chose la plus proche que vous avez est Array.Copy bien qu'elle ne fonctionne que lorsque les tableaux ont les mêmes dimensions (personnellement, je ne l'utilise qu'avec des tableaux 1D). Quoi qu'il en soit, j'ai trouvé un lien intéressant sur la performance de Array.Copy() vs. loop pour les tableaux 2D (c'est en C# mais tout est applicable à VB.NET).

Résumé : votre code est vraiment rapide et n'a pas besoin d'être amélioré. Dans le cas d'une alternative valable (Array.Copy fonctionnant pour 2D et 1D, ce qui n'existe pas), la performance résultante serait juste un peu meilleure (et seulement pour des tableaux de petite taille).

1voto

Ceres Points 1805

Si vous souhaitez utiliser plus d'un fil, vous pouvez utiliser une boucle for parallèle.

http://msdn.microsoft.com/en-us/library/dd460713.aspx

Dim matrix(vectorCount() - 1, parameterCount()) As Double
Dim params(parameterCount() - 1) As Double

Parallel.For(0, vectorCount() - 1, Sub(i)
                                      matrix(i, 0) = vectorScore(i)
                                      params = vectorValues(i)
                                      For j As Integer = 0 To params.Length - 1
                                          matrix(i, j+1) = params(j)
                                      Next
                                   End Sub)

1voto

the_lotus Points 3385

Cela dépend beaucoup de la taille du tableau, la boucle for est très efficace mais avec de très grands tableaux, vous pouvez voir une amélioration avec array.copy ou buffer.blockcopy.

Sub Main()

    Const ARR_SIZE_X As Integer = 9999999
    Const ARR_SIZE_y As Integer = 5
    Const DBL_SIZE As Integer = 8

    Dim watch As New Stopwatch

    Dim a1(ARR_SIZE_X) As Double
    Dim a2(ARR_SIZE_y, ARR_SIZE_X) As Double

    For x = 0 To ARR_SIZE_X
        a1(ARR_SIZE_X) = x
    Next

    watch.Start()

    For t = 0 To 10
        For y = 0 To ARR_SIZE_y
            For x = 0 To ARR_SIZE_X
                a2(y, x) = a1(x)
            Next
        Next
    Next

    watch.Stop()
    Console.WriteLine(watch.ElapsedTicks)

    watch.Reset()

    watch.Start()

    For t = 0 To 10
        For y = 0 To ARR_SIZE_y
            System.Buffer.BlockCopy(a1, 0, a2, (ARR_SIZE_X + 1) * DBL_SIZE * y, DBL_SIZE * ARR_SIZE_X)
        Next
    Next

    watch.Stop()
    Console.WriteLine(watch.ElapsedTicks)

    'For y = 0 To 4
    '    For x = 0 To 4
    '        Console.Write(a2(y, x))
    '    Next

    '    Console.WriteLine()
    'Next

    Console.ReadLine()

End Sub

1voto

ATeDe Points 11
Function OneD2TwoD(ByVal xLen As Integer, ByVal yLen As Integer)
    ' (1) populate 1d array
    Dim TwoD(xLen, yLen) As Integer
    Dim OneD((xLen + 1) * (yLen + 1) - 1) As Integer
    For i As Integer = 0 To OneD.GetUpperBound(0)
        OneD(i) = i
    Next
    PrintValues(OneD, "|")
    Console.WriteLine()
    ' (2) Convert 1d array to 2d array/
    Dim z, Row(yLen) As Integer
    For x As Integer = 0 To xLen
        For y As Integer = 0 To yLen
            z = x * (yLen + 1) + y
            TwoD(x, y) = OneD(z)
            Row(y) = TwoD(x, y)
        Next
        PrintValues(Row, "|")
    Next
    Console.WriteLine()
    ' (3) Convert 2d array to 1d array/
    Erase OneD
    ReDim OneD((xLen + 1) * (yLen + 1) - 1)
    For x As Integer = 0 To xLen
        For y As Integer = 0 To yLen
            z = y + x * (yLen + 1)
            OneD(z) = TwoD(x, y)
        Next
    Next
    PrintValues(OneD, "|")
End Function

Public Sub PrintValues(ByVal myList As IEnumerable, ByVal mySeparator As Char)
    ' source: https://msdn.microsoft.com/en-us/library/system.collections.arraylist.add(v=vs.110).aspx
    Dim obj As [Object]
    For Each obj In myList
        Console.Write("{0}{1}", mySeparator, obj)
    Next obj
    Console.WriteLine()
End Sub 'PrintValues

Exemple pour : OneD2TwoD(0, 10)

(1) Remplir le tableau 1D

|0|1|2|3|4|5|6|7|8|9|10

(2) Convertir un tableau 1D en tableau 2D

|0|1|2|3|4|5|6|7|8|9|10

(3) Conversion d'un tableau 2D en un tableau 1D

|0|1|2|3|4|5|6|7|8|9|10

Exemple pour : OneD2TwoD(5, 0)

(1) Remplir le tableau 1D

|0|1|2|3|4|5

(2) Convertir un tableau 1D en tableau 2D

|0

|1

|2

|3

|4

|5

(3) Conversion d'un tableau 2D en un tableau 1D

|0|1|2|3|4|5

Exemple pour : OneD2TwoD(2, 5)

(1) Remplir le tableau 1D

|0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17

(2) Convertir un tableau 1D en tableau 2D

| 0| 1| 2| 3| 4| 5

| 6| 7| 8| 9|10|11

|12|13|14|15|16|17

(3) Conversion d'un tableau 2D en un tableau 1D

|0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17

Merci de votre attention

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X