2013-05-02 27 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 
相关问题