1

我想从二维数组 [1024,9] 中获取最小值,并且我想要这个最小值的位置。

提示:最后一列是标志“如果标志== 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
4

3 回答 3

1

首先:

如果碰巧没有任何行将“使用此行”标志设置为零(零表示“使用此行”),您显然会得到错误的结果。我想您的数据永远不会发生这种情况?

第二:

如果为非零,即使标志表明您不应该使用该行fill_file[0,8],您仍将初始化min为。fill_file[0,0]在这种情况下,如果fill_file[0,0]恰好小于任何fill_file[row,8]为零的行中的所有值,那么您将得到错误的结果。

我很想分别初始化minfloat.MaxValue和-1 indind2所以你知道它们是否没有更新。并打电话给他们minRowminCol

第三:

有一个明显的优化:如果 [row,8] 不为零,则为该行运行内部迭代是没有意义的。

把这一切放在一起:

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
于 2013-05-02T17:18:42.813 回答
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 ;
}
于 2013-05-02T17:13:54.880 回答
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;
}
于 2013-05-02T16:53:12.887 回答