![](/img/trans.png)
[英]How to get 1D column array and 1D row array from 2D array? (C# .NET)
[英]How to get minimum value from 2D array in c# and the indices of that cell?
我想從二維數組[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
首先:
如果碰巧沒有任何行的“使用此行”標志設置為零(零表示“使用此行”),則顯然會得到錯誤的結果。 我想這對您的數據永遠不會發生?
其次:
如果fill_file[0,8]
為非零,即使標記表明您不應該使用該行,您仍將min
初始化為fill_file[0,0]
。 在這種情況下,如果fill_file[0,0]
恰好小於fill_file[row,8]
為零的任何行中的所有值,那么您將得到錯誤的結果。
我很想將min
初始化為float.MaxValue
並將ind
和ind2
分別初始化為-1,所以您知道它們是否尚未更新。 並將它們minRow
和minCol
。
第三:
有一個明顯的優化方法:如果[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
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;
}
這是一個簡單的問題。 嘗試這樣的事情:
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 ;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.