2011-10-21 6 views
-5

J'ai 6 périphériques qui envoient des données à des intervalles de 10 secondes. Recevoir ces données et envoyer à 8 tableaux. Le premier est l'index. La seconde est les heures. Les six suivants sont un pour chaque périphérique. Après une durée prédéterminée, le système cesse de recevoir des données. Après l'arrêt, j'ai besoin d'obtenir le maximum, le minimum et la moyenne des sélections de quelques 6 tableaux et de remplir un autre tableau. J'ai besoin d'une boucle pour, comment faire? Par exemple. MyArray1 [320,18] et MyArray2 [8,18]Moyenne dans la matrice C#

Comment ceci:

/*  
//myArray2 [0,0] = MAXIMUM (myArray1 from Here [11,0] to Here myArray1 [17,0]) 
//myArray2 [1,0] = AVERAGE (myArray1 from Here [18,0] to Here myArray1 [24,0]) 
//myArray2 [2,0] = AVERAGE (myArray1 from Here [25,0] to Here myArray1 [75,0]) 
//myArray2 [3,0] = AVERAGE (myArray1 from Here [76,0] to Here myArray1 [180,0]) 
//myArray2 [4,0] = AVERAGE (myArray1 from Here [181,0] to Here myArray1 [320,0]) 
*/ 

Cordialement, ocaccy

Répondre

3

Je suppose que vous voulez max et moyenne seulement sur des plages spécifiques dans le tableau multidimensionnel. En utilisant des méthodes d'extension, il est un peu compliqué, mais vous pouvez le faire comme ceci:

var myArray1 = new double[320, 18]; 
var myArray2 = new double[8, 18]; 

int dim2 = myArray1.GetLength(1); 
    myArray2[0, 0] = 
     myArray1.Cast<double>().Select((val, idx) => new { idx, val }).Where(
     x => x.idx % dim2 == 0 && x.idx/dim2 >= 11 && x.idx/dim2 < 18).Max(x => x.val); 
    myArray2[1, 0] = 
     myArray1.Cast<double>().Select((val, idx) => new { idx, val }).Where(
     x => x.idx % dim2 == 0 && x.idx/dim2 >= 18 && x.idx/dim2 < 25).Average(x => x.val); 
// ... 

L'inconvénient est que vous serez itérer tous les éléments tout le temps. Donc, si cela est performance critical, je suggère plutôt le faire à l'ancienne et en un seul passage:

myArray2[0, 0] = double.MinValue; 
myArray2[1, 0] = 0; 
for (int i = 0; i < myArray1.GetLength(0) + 1; i++) { 
    if (i >= 11 && i < 18 && myArray1[i, 0] > myArray2[0, 0]) myArray2[0, 0] = myArray1[i, 0]; 
    if (i >= 18 && i < 25) myArray2[1, 0] += myArray1[i, 0]; 
    if (i == 25) myArray2[1, 0] /= Math.Abs(25 - 18); 
    // ... 
} 

Et une dernière suggestion: Ne mettez pas les numéros de magie dans votre code (11, 18, 25, ...), mais utilise consts pour cela. Plus tard, personne ne sait plus ce que cela veut dire.

EDIT2: J'ai finalement obtenu la solution de la méthode d'extension.

+0

Merci DonAndre. J'ai la chaîne myArray [200,50]; Comment convertir cette chaîne myArray [200,50] en int myArray2 [200,50]? Cordialement, ocaccy – soushinsha

+0

'int.parse (string)' ... vous devriez avoir un livre sur la programmation en C#. Btw, si c'était une sorte de devoirs, vous devriez ajouter l'étiquette de devoirs. – Andreas