获取此数组的最小值和第二最小值

时间:2019-04-25 00:23:38

标签: c#

我试图从两个二维数组中导入数据,然后进行一些计算以获得最小值和次要最小值,但我得到的最小值是零,甚至没有值。

double[,] Cranelocations = { { 28.6744, 3.45 }, { 29.67, 7.25 }, { 30.67, -10.6 }, { 31.67, 11.02 }, { 32.67, 5.45 } };
double[,] Picklocation = { { 20.6744, -8.4656 }, { 21.6744, -8.4656 }, { 22.6744, -8.4656 }, { 23.6744, -8.4656 }, { 24.6744, -8.4656 }, { 25.6744, -8.4656 }, { 26.6744, -8.4656 }, { 27.6744, -8.4656 } };
double[,] Setlocation = { { 20.62, 5.03 }, { 24.28, 5.03 }, { 35.99, 14.55 }, { 19, 18.16 }, { 35.99, 5.26 }, { 40.18, 5.26 }, { 9.6, 13.16 } };
double[] Angles = new double[Cranelocations.GetLength(0) * Picklocation.GetLength(0) * Setlocation.GetLength(0)];

double Seta;

for (int i = 0; i < Cranelocations.GetLength(0); i++)
{
    for (int j = 0; j < Picklocation.GetLength(0); j++)
    {
        for (int k = 0; k < Setlocation.GetLength(0); k++)
        {
            double C1 = Picklocation[j, 0] - Cranelocations[i, 0];
            double V1 = Picklocation[j, 1] - Cranelocations[i, 1];
            double C2 = Setlocation[k, 0] - Cranelocations[i, 0];
            double V2 = Setlocation[k, 1] - Cranelocations[i, 1];
            double C3 = Math.Sqrt(Math.Pow(C1, 2) + Math.Pow(V1, 2));
            double V3 = Math.Sqrt(Math.Pow(C2, 2) + Math.Pow(V2, 2));

            Seta = Math.Acos(((C1 * C2) + (V1 * V2)) / (C3 * V3));
            Angles[i] = Seta * 180 / Math.PI;
            Angles[k] = Seta * 180 / Math.PI;
            Angles[j] = Seta * 180 / Math.PI;
        }
    }
}

Console.WriteLine(Angles.Min());

2 个答案:

答案 0 :(得分:0)

我认为您需要在代码的开头声明“ Angles”变量以及“ Seta”和“ Angle”。

答案 1 :(得分:0)

您的Angles数组具有 280 个元素:

double[] Angles = new double[Cranelocations.GetLength(0) * Picklocation.GetLength(0) * Setlocation.GetLength(0)];

由于它是double[],所以这些元素都不可以是null。它们都是0。然后在代码中,用其他数字替换该数组的前8个元素。结果是您有一个包含272个零和8个大于零的数字的数组。

该数组中的最小值是0。第二个最小值是0。第三个最小值是0。依此类推。

使用2D数组的内部尺寸(宽度为2个元素的数组)定义Angles。注意.GetLength()的参数:

double[] Angles = new double[Cranelocations.GetLength(1) * Picklocation.GetLength(1) * Setlocation.GetLength(1)];

那样,它只有8个零,所有零在代码中得到更新。那么最小值将为67.3864169484903

关于如何获得第二个最小值,最简单的解决方案可能只是对数组进行排序并打印出前两个元素。像这样:

foreach (var a in Angles.OrderBy(a => a).Take(2))
    Console.WriteLine(a);