2013-05-02 54 views
1

我想從2維數組[1024,9]中獲取最小值,並且我想要這個最小值的位置。如何從c#中的二維數組中獲取最小值以及該單元格的索引?

提示:最後一列是標誌「如果標誌== 0:檢查該行,否則:跳過此行的」

我試過這個鱈魚,但它並沒有幫助我...

float min = fill_file[0, 0]; 
      int ind = 0; 
      int ind2 = 0; 

      for (int i = 0; i < 1024; i++) 
      { 
       for (int j = 0; j < 8; j++) 
       { 
        if (fill_file[i, j] < min && fill_file[i, 8] == 0) 
        { 
         min = fill_file[i, j]; 
         ind2 = i; 
         ind = j; 
        } 
       } 
      } 

這是根據您的要求

int t = 0; 
     while (t < 1024) 
     { 
      float min = fill_file[0, 0]; 
      int ind = 0; 
      int ind2 = 0; 

      for (int i = 0; i < 1024; i++) 
      { 
       for (int j = 0; j < 8; j++) 
       { 
        if (fill_file[i, j] < min && fill_file[i, 8] == 0) 
        { 
         min = fill_file[i, j]; 
         ind2 = i; 
         ind = j; 
        } 
       } 
      } 

      machens[ind] = machens[ind] + min; 
      fill_file[ind2, 8] = 1; 

      for (int r = 0; r < 1024; r++) 
      { 
       if (fill_file[r, 8] != 1) 
        fill_file[r, ind] = fill_file[r, ind] + min; 
      } 

      t++; 
     }//End while 
+0

如何小得多的2-d陣列的示例數據? – 2013-05-02 16:51:11

+2

爲什麼它不起作用?它看起來非常適合我。你最終的結果是:fill_file [ind,ind2]還是fill_file [ind2,ind]? – 2013-05-02 16:51:16

+2

請注意,所得到的最小值將在'fill_file [ind2,ind]'和** not **中在'fill_file [ind,ind2]'中。 – cdhowie 2013-05-02 16:52:19

回答

0

此代碼的所有代碼:

var min_ij = Enumerable.Range(0, 1024) 
    .Where(i => fillFile[i, 9] == 0) 
    .SelectMany(i => Enumerable.Range(0, 8) 
     .Select(j => new { i, j })) 
    .ArgMin(ij => fillFile[ij.i, ij.j]); 

int min_i = min_ij.i; 
int min_j = min_ij.j; 

使用這個輔助函數:

public static TElem ArgMin<TElem, TField>(this IEnumerable<TElem> set, Func<TElem, TField> objective, bool allowEmptySet = false) 
    where TField : IComparable<TField> 
{ 
    if (!set.Any() && !allowEmptySet) 
     throw new InvalidOperationException("Cannot perform ArgMin on an empty set."); 

    bool first = true; 
    TElem bestElem = default(TElem); 
    TField bestObjective = default(TField); 
    foreach (TElem currElem in set) 
    { 
     TField currObjective = objective(currElem); 
     if (first || currObjective.CompareTo(bestObjective) < 0) 
     { 
      first = false; 
      bestElem = currElem; 
      bestObjective = currObjective; 
     } 
    } 

    return bestElem; 
} 
+1

並且該值的位置是...? – 2013-05-02 16:53:53

+0

@JonSkeet更新時間... – 2013-05-02 16:55:00

0

這是一個簡單的問題。嘗試是這樣的:

static void Main(string[] args) 
{ 
    int[,] values = new int[1024,9]; 
    Random rng = new Random() ; 

    // initialise the array 
    for (int r = 0 ; r < 1024 ; ++r) 
    { 
    for (int c = 0 ; c < 9 ; ++c) 
    { 
     values[r,c] = rng.Next() ; 
    } 

    int x = rng.Next(10) ; 
    if (x == 1) 
    { 
     values[r,8] = 0 ; 
    } 
    } 

    int? minValue = null ; 
    int? minRow = null ; 
    int? minCol = null ; 
    for (int r = 0 ; r < 1024 ; ++r) 
    { 
    bool skipRow = 0 == values[r,8] ; 
    if (skipRow) continue ; 
    for (int c = 0 ; c < 8 ; ++c) 
    { 
     int cell = values[r,c] ; 
     if (!minValue.HasValue || cell < minValue) 
     { 
     minValue = cell ; 
     minRow = r ; 
     minCol = c ; 
     } 
    } 
    } 

    // display the results 
    if (minValue.HasValue) 
    { 
    Console.WriteLine("Minimum: values[{0},{1}] is {2}" , minRow , minCol , minValue); 
    } 
    else 
    { 
    Console.WriteLine("all rows skipped"); 
    } 
    return ; 
} 
1

首先:

如果碰巧沒有行有「使用該行」標誌設置爲零(零意爲「使用該行」),你顯然會得到一個錯誤的結果。 我想這不會發生你的數據?

其次:

如果fill_file[0,8]爲非零值,你仍然會被初始化minfill_file[0,0]即使旗說,你不應該使用該行。 在這種情況下,如果fill_file[0,0]恰好小於fill_file[row,8]爲零的任何行中的所有值,那麼您將得到錯誤的結果。

我會被誘惑初始化minfloat.MaxValueindind2爲-1,每次,所以你知道,如果他們沒有被更新。 並稱它們爲minRowminCol

三:

有一個明顯的優化:如果[行,8]不爲0,有一個在運行該行內部循環沒有意義的。

把此一起:

float minValue = float.MaxValue; 
int minCol = -1; 
int minRow = -1; 

for (int row = 0; row < 1024; row++) 
{ 
    if (fill_file[row, 8] == 0) 
    { 
     for (int col = 0; col < 8; col++) 
     { 
      if (fill_file[row, col] < minValue) 
      { 
       minValue = fill_file[row, col]; 
       minRow = row; 
       minCol = col; 
      } 
     } 
    } 
} 

// If minRow is < 0, then no valid data exists. 
// Otherwise, fill_file[minRow, minCol] contains minVal 
相關問題