在矩阵中找到最小的数字? C#控制台

时间:2019-12-11 09:59:02

标签: c# visual-studio math

我在矩阵中找到了最大的数字,但找不到最小的数字

我将最大的矩阵[i,j]值添加到maximax数组。 但是我无法将最小值添加到Minimax数组中。

/* Maximax degerini bulmak */

for (int i = 0; i < olay; i++)
{
    for (int j = 0; j < state; j++)
    {
        if (maximax[i] < matris[i, j])
        {
            maximax[i] = matris[i, j];
        }
    }
}

/* Olaylar icin en yuksek State degerleri */
Console.WriteLine();
for (int i = 0; i < maximax.Length; i++)
{
    Console.WriteLine(i+1+". Olay için en yüksek State degeri: "+maximax[i]);
}

/* En yuksek State degerini secmek */
ebState = maximax[0];
for (int i = 0; i < maximax.Length; i++)
{
    if (maximax[i] > ebState)
    {
        ebState = maximax[i];
        ebStateSiraSayisi = i;
    }   
}
Console.WriteLine();
/* Sonucu yazdırmak */
Console.WriteLine("Maximax kuralina göre " + ebState + " degeri secilir. ");
/* /Maximax degerini bulmak */

3 个答案:

答案 0 :(得分:0)

Console.Write("Probleminizdeki Olay sayisini giriniz:");
int olay = Convert.ToInt32(Console.ReadLine());

Console.Write("Probleminizdeki State sayisini giriniz:");
int state = Convert.ToInt32(Console.ReadLine());
/* Degiskenler */
double[,] matris = new double[olay, state];
double[] maximax = new double[olay];
double[] minimax = new double[olay];
double ebState;
int ebStateSiraSayisi;
/* /Degiskenler */

/* Olay - State Tablosu Taslak Görünümü */
Console.WriteLine();
Console.WriteLine("Olay - State Tablosu Taslak Görünümü");
for (int i=0; i<olay; i++)
{
    Console.Write(i+1+". Olay: ");
    for (int j=0; j<state; j++)
    {
        Console.Write(j+1+". State Değeri -- ");
    }
    Console.WriteLine();
}
/* /Olay - State Tablosu Taslak Görünümü */

/* Olaylar için State değerleri girişi */
for (int i =0; i<olay; i++)
{
    for (int j=0;j<state;j++)
    {
        Console.Write(i + 1 +". Olayın "+ (j+1) +". State değerini giriniz: ");
        matris[i, j] = Convert.ToDouble(Console.ReadLine());
    }
}
/* /Olaylar için State değerleri girişi */

/* Olaylar için State değerleri girişini ekrana yazdırmak */
Console.WriteLine();
for (int i = 0; i < olay; i++)
{
    Console.Write(i + 1 + ". Olay: ");
    for (int j = 0; j < state; j++)
    {
        Console.Write(j+1+". State Değeri: "+matris[i,j]+" --- ");
    }
    Console.WriteLine();
}
/* /Olaylar için State değerleri girişini ekrana yazdırmak */

/* Maximax degerini bulmak */

for (int i = 0; i < olay; i++)
{
    for (int j = 0; j < state; j++)
    {
        if (maximax[i] < matris[i, j])
        {
            maximax[i] = matris[i, j];
        }
    }
}

/* Olaylar icin en yuksek State degerleri */
Console.WriteLine();
for (int i = 0; i < maximax.Length; i++)
{
    Console.WriteLine(i+1+". Olay için en yüksek State degeri: "+maximax[i]);
}

/* En yuksek State degerini secmek */
ebState = maximax[0];
for (int i = 0; i < maximax.Length; i++)
{
    if (maximax[i] > ebState)
    {
        ebState = maximax[i];
        ebStateSiraSayisi = i;
    }   
}
Console.WriteLine();
/* Sonucu yazdırmak */
Console.WriteLine("Maximax kuralina göre " + ebState + " degeri secilir. ");
/* /Maximax degerini bulmak */




Console.ReadLine();

答案 1 :(得分:0)

一种方法是使用Buffer.BlockCopy()将2D数组快速转换为1D数组,然后使用常规double[]进行搜索。

/// <summary>
/// Find the maximum absolute value in an array
/// </summary>
/// <param name="array">The array</param>
public static double MaxAbs(this double[,] array)
{
    var packed = array.ToPackedArray();
    return packed[MaxAbsIndex(packed)];
}
/// <summary>
/// Find the minimum absolute value in an array
/// </summary>
/// <param name="array">The array</param>
/// <param name="exclude_zero">Ignore zero values?</param>
public static double MinAbs(this double[,] array, bool exclude_zero = true)
{
    var packed = array.ToPackedArray();
    return packed[MinAbsIndex(packed, exclude_zero)];
}

/// <summary>
/// Find the index of the maximum absolute value in an array
/// </summary>
/// <param name="array">The array</param>
public static int MaxAbsIndex(this double[] array)
{
    int res = 0;
    double x = array[0];
    for (int i = 1; i<array.Length; i++)
    {
        var t = Abs(array[i]);
        if (t>x)
        {
            x=t;
            res = i;
        }
    }
    return res;
}
/// <summary>
/// Find the index of the minimum absolute value in an array
/// </summary>
/// <param name="array">The array</param>
/// <param name="exclude_zero">Ignore zero values?</param>
public static int MinAbsIndex(this double[] array, bool exclude_zero = true)
{
    int offset = 0;
    // skip leading zeros if exclude_zero is enabled.
    while (exclude_zero && offset<array.Length && Abs(array[offset])==0)
    {
        offset++;
    }
    int res = offset;
    double x = Abs(array[offset]);
    for (int i = offset+1; i < array.Length; i++)
    {
        var t = Abs(array[i]);
        if (t<x && (t>0 || !exclude_zero))
        {
            x = t;
            res = i;
        }
    }
    return res;
}

这里供参考的是打包(2D或1D)函数,对于double类型的数组,反向打包(从1D到2D)。

/// <summary>
/// Copy all elements of the native array into a packed array. Elements are arranged row-by-row.
/// For example <c>[1,2 | 3,4] => [1,2,3,4]</c>
/// </summary>
/// <param name="matrix">The native array</param>
/// <returns>The packed array</returns>
public static double[] ToPackedArray(this double[,] matrix)
{
    int n = matrix.GetLength(0);
    int m = matrix.GetLength(1);
    double[] result = new double[n*m];
    Buffer.BlockCopy(matrix, 0, result, 0, Buffer.ByteLength(result));
    return result;
}
/// <summary>
/// Copy all elements of a packed array into a native array. Elements are arranged row-by-row.
/// For example <c> [1,2,3,4] => [1,2 | 3,4]</c>
/// </summary>
/// <param name="matrix">The packed array</param>
/// <param name="rows">The number of rows in the matrix</param>
/// <param name="columns">The number of columns in the matrix. If 0, this value is calculated from length/rows</param>
/// <returns></returns>
public static double[,] FromPackedArray(this double[] matrix, int rows, int columns = 0)
{
    if (columns==0)
    {
        columns=matrix.Length/rows;
    }
    double[,] result = new double[rows, columns];
    Buffer.BlockCopy(matrix, 0, result, 0, Buffer.ByteLength(result));
    return result;
}

答案 2 :(得分:0)

要获取矩阵中的最小值,无需定义新数组即可存储它。 您可以直接遍历矩阵。

int[,] matrix = new int[3, 4] { { 0, -20, 2, 3 }, { 4, 5, 6, -1 }, { 8, 9, -13, 11 } };
int minnum = matrix[0, 0];
for (int i = 0; i < matrix.GetLength(0); i++)
{
    for (int j = 0; j < matrix.GetLength(1); j++)
    {
        if (minnum > matrix[i, j])
        {
            minnum = matrix[i, j];
        }
    }
}
Console.WriteLine("Minimum = " + minnum);