2017-01-26 7 views
0

私は配列のリストを持っており、これらの配列のうち常に4つのグループの列を平均化しようとしています。例としてC# - 常に列の平均4つの配列のグループを配列

UInt16[] array_0 = new UInt16[]{ 1, 2, 3, 4}; 
UInt16[] array_1 = new UInt16[]{ 7, 2, 3, 4}; 
// ... 

var lists = new UInt16[120][]; 
lists[0] = array_0; 
lists[1] = array_1; 
// ... 

結果は配列のリストであるべきです。各配列は、4つの配列にわたる各第1、第2、...要素の平均で満たされます。 最初のresult_arrayには、最初の4つのグループ(配列0〜3)の最初の要素からの平均値、このグループの2番目の要素などが含まれます。 2番目のresult_arrayには、2番目の4つのグループ(配列4-7)の最初の要素からの平均値、このグループの2番目の要素などが含まれます。私は今だけで何ができるか

UInt16[] array_0 = {1 2 3 4} 
UInt16[] array_1 = {1 2 3 4}    
UInt16[] array_2 = {3 4 5 6}    
UInt16[] array_3 = {3 4 5 6}    
UInt16[] ergebnis1= {2 3 4 5}    

UInt16[] array_4 = {2 1 3 4} 
UInt16[] array_5 = {4 1 3 4} 
UInt16[] array_6 = {3 2 3 4} 
UInt16[] array_7 = {3 4 3 4} 
UInt16[] ergebnis2= {4 2 3 4} // Mean of the first four elements, second four elements,.. 

は、このようなリスト全体のすべての列の上に平均化することである。

var listLengths = lists.Select(x => x.Count()); 
var lengthOfEachList = listLengths.First(); 
var averages = new List<double>(); 
for (var i = 0; i != lengthOfEachList; i = i+1) 
{ 
    averages.Add(lists.Average(x => x[i])); 
} 

は、誰もがそれを解決する方法のアイデアを持っていますか?

+0

なぜ「UInt16」ですか? .NET(少なくとも)では、符号なしの型の使用を避けるべきです。 –

+0

出力として、2つの数字または2つの数字の配列が必要ですか? –

+0

申し訳ありませんが、2つの配列の平均値が出力として出力されます – MomooomoM

答えて

0

ここでは、配列のグループの平均を計算する関数です。

double[] AverageSets(int numberOfArrays, int offset, int[,] array) 
{ 
    var length = array.GetLength(1); 
    var avgs = new double[length]; 
    double n = 1; 
    for (int i = offset; i < offset + numberOfArrays; i++) 
    { 
     for (var j = 0; j < length; j++) 
     { 
      avgs[j] = avgs[j] * (n-1)/n + array[i,j]/n; 
     } 
     n++; 
    } 

    return avgs; 
} 

配列1-3の平均値を計算した例です。

int[,] array = 
{ 
    {1, 2, 3, 4}, 
    {1, 2, 3, 4}, 
    {3, 4, 5, 6}, 
    {3, 4, 5, 6}, 
    {2, 1, 3, 4}, 
    {4, 1, 3, 4}, 
    {3, 2, 3, 4}, 
    {3, 4, 3, 4} 
}; 

var results = AverageSets(3, 1, array); 

結果= [ 2.33333333333333、 3.33333333333333、 4.33333333333333、 5.33333333333333 ]

は、これはあなたがあなたが考えているより大きな配列をループに必要なユーティリティを与える必要があります。 (このコードでは、配列の配列を等しい部分に分割したと仮定して、配列の最後のブロックが平均化したい配列の数よりも短い場合、エラー処理が必要になります)。

for(int i = 0;i < lists.Count;i += numberOfArraysYouWantAveraged) 
{ 
    AverageSets(numberOfArraysYouWantAveraged, i, lists); 
} 
0
var averageslow = new List<double>(); 
var averageshigh = new List<double>(); 
for (var i = 0; i < 4; i++) 
{ 
    averageslow.Add(lists.Average(x => x[i])); 
} 
for (var i = 4; i < 8; i++) 
{ 
    averageshigh.Add(lists.Average(x => x[i])); 
} 
+0

私はこれが私が探していた解決策ではないと思います。私はこの質問のいくつかの情報と例を編集しました。たぶん今私が探しているものを理解することは簡単です。 私はLinqを使うことを考えましたが、私が試したすべてがエラーに陥りました。 – MomooomoM

関連する問題