【问题标题】:Get the minimum and second minimum of this array获取此数组的最小值和第二最小值
【发布时间】:2019-04-25 18:05:31
【问题描述】:

我正在尝试从三个二维数组导入数据并应用一些计算然后得到最小值和第二个最小值,但我得到的最小值为零,甚至不在值中。

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());

【问题讨论】:

  • 我在该代码中看不到任何试图获取最小值或第二最小值的内容。你还没有写清楚的代码是行不通的。
  • 你在哪里定义Angles?你怎么知道里面没有0?当我复制/粘贴这个确切的代码并定义Angles 时,它工作得很好。最小值输出为67.3864169484903
  • 我刚刚修改了角度澄清的代码,你能告诉我它是如何得到最小值和第二个最小值的吗?我不知道如何编码
  • 你是如何定义角度的?最小值在 26 左右
  • 如果您对性能感兴趣,您可以通过使用PartialSort 而不是OrderBy+Take 来实现2 倍或更多的提升。

标签: c#


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您的 Angles 数组有 280 个元素:

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

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

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

    使用二维数组的内部维度(即 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);
    

    【讨论】:

    • 我没有得到前 8 个元素的部分,而且如果你尝试显示 Angles 数组,你会看到有小于 67.3864169 的数字。
    • @AlaaMagdy:遍历整个数组并输出。或者,更好的是,在嵌套循环后暂停调试器并观察数组。你会看到有很多超过 8 个元素,第 8 个元素之后的所有元素都是 0,前 8 个元素中最低的是 67。此时你只是在和数学争论,你错了。如果您甚至不查看自己代码的结果,我们将无法为您提供帮助。
    • 我不是在争论数学或任何事情,我在 Visual Studio 上完全执行相同的代码,它得到的数字比我从您的链接中看到的没有零的数字更多
    • @AlaaMagdy:那么您的下一步似乎是确定您使用的代码与您问题中的代码有何不同。因为您问题中的代码非常清楚地产生了此处描述和演示的结果。
    • 这是完全相同的代码。最低数字应该是 12.933,当我显示整个数组 Console.wrtieline(Angles); 时我得到它。如果你这样做了,你会发现有 280 个数字并且它们都是不同的,这意味着它运行良好,但我不知道零在哪里以及为什么它们不显示
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-04
    • 2020-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-16
    • 2010-11-23
    相关资源
    最近更新 更多