я пробую результаты, которые хранятся в предыдущих массивах (1 и 2) в новом массиве 3, могут показывать каждый результат из массива 1 с каждым массивом 2, когда я показываю результаты из каждого отдельно, они в порядке, но когда я пытаюсь смешать их в массиве 3, я получаю правильные ответы для первого значения в массиве 1 со всеми значениями в массиве 2, затем появляется много нулей.
вот код для массива 3
for (int i = 0; i < result1.GetLength(0); i++)
{
for (int j = 0; j < result1.GetLength(1); j++)
{
for (int k = 0; k < result2.GetLength(0); k++)
{
for (int m = 0; m < result2.GetLength(1); m++)
{
result3[i, j] = result1[i, j] + "," + result2[k, m];
Console.WriteLine(result3[i, j]);
counter++;
}
}
}
}
а вот и весь код
double[,] Cranelocations = { { -12.3256, 0.5344 }, { -12.3256, -0.4656 }, { -12.3256, -1.4656 }, { -12.3256, -2.4656 } };
double[,] Picklocation = { { -0.3256, -3.4656 }, { 0.6744, -3.4656 }, { 1.6744, -3.4656 }, { 2.6744, -3.4656 }, { 3.6744, -3.4656 }, { 4.6744, -3.4656 }, { 5.6744, -3.4656 } };
double[,] Setlocation = { { 20.62, 5.03 }, { 24.28, 5.03 }, { 28.40, 5.03 }, { 32.11, 5.03 }, { 35.99, 5.26 }, { 40.18, 5.26 } };
double[] Weights = { 11.7865, 14.7335, 15.1015, 10.7465 };
double[,] result1 = new double[Weights.Length * Cranelocations.GetLength(0), Picklocation.GetLength(0)];
double[,] result2 = new double[Weights.Length * Cranelocations.GetLength(0), Setlocation.GetLength(0)];
object[,] result3 = new object[result1.GetLength(0) * result1.GetLength(1), result2.GetLength(0) * result2.GetLength(1)];
int counter = 0;
for (int m = 0; m < Weights.Length; m++)
{
for (int i = 0; i < Cranelocations.GetLength(0); i++)
{
for (int j = 0; j < Picklocation.GetLength(0); j++)
{
double x = Cranelocations[i, 0] - Picklocation[j, 0];
double y = Cranelocations[i, 1] - Picklocation[j, 1];
result1[i, j] = Weights[m] * (Math.Sqrt(Math.Pow(x, 2) + Math.Pow(y, 2)));
}
}
}
Console.WriteLine("-----------------------------------------------------------------");
for (int m = 0; m < Weights.Length; m++)
{
for (int i = 0; i < Cranelocations.GetLength(0); i++)
{
for (int j = 0; j < Setlocation.GetLength(0); j++)
{
double x = Cranelocations[i, 0] - Setlocation[j, 0];
double y = Cranelocations[i, 1] - Setlocation[j, 1];
result2[i, j] = Weights[m] * (Math.Sqrt(Math.Pow(x, 2) + Math.Pow(y, 2)));
}
}
}
for (int i = 0; i < result1.GetLength(0); i++)
{
for (int j = 0; j < result1.GetLength(1); j++)
{
for (int k = 0; k < result2.GetLength(0); k++)
{
for (int m = 0; m < result2.GetLength(1); m++)
{
result3[i, j] = result1[i, j] + "," + result2[k, m];
Console.WriteLine(result3[i, j]);
counter++;
}
}
}
}
}





Для каждого m вы сбрасываете i на 0 и снова начинаете писать в начале массива.
Вам нужно продолжать перемещать индекс вперед, когда вы увеличиваете m.
То же самое, когда вы объединяете два индекса. Когда вы объединяете две итерации для получения индекса, вы обычно умножаете первую на длину второй, а затем складываете их вместе.
for (int m = 0; m < Weights.Length; m++)
{
int offset = m * Cranelocations.GetLength(0);
for (int i = 0; i < Cranelocations.GetLength(0); i++)
{
for (int j = 0; j < Picklocation.GetLength(0); j++)
{
double x = Cranelocations[i, 0] - Picklocation[j, 0];
double y = Cranelocations[i, 1] - Picklocation[j, 1];
result1[i + offset, j] = Weights[m] * (Math.Sqrt(Math.Pow(x, 2) + Math.Pow(y, 2)));
}
}
}
Console.WriteLine("-----------------------------------------------------------------");
for (int m = 0; m < Weights.Length; m++)
{
int offset = m * Cranelocations.GetLength(0);
for (int i = 0; i < Cranelocations.GetLength(0); i++)
{
for (int j = 0; j < Setlocation.GetLength(0); j++)
{
double x = Cranelocations[i, 0] - Setlocation[j, 0];
double y = Cranelocations[i, 1] - Setlocation[j, 1];
result2[i + offset, j] = Weights[m] * (Math.Sqrt(Math.Pow(x, 2) + Math.Pow(y, 2)));
}
}
}
for (int i = 0; i < result1.GetLength(0); i++)
{
int iOffset = i * result1.GetLength(1);
for (int j = 0; j < result1.GetLength(1); j++)
{
for (int k = 0; k < result2.GetLength(0); k++)
{
int kOffset = k * result2.GetLength(1);
for (int m = 0; m < result2.GetLength(1); m++)
{
result3[iOffset + j, kOffset + m] = result1[i, j] + "," + result2[k, m];
Console.WriteLine(result3[iOffset + j, kOffset + m]);
counter++;
}
}
}
}
мое намерение использовать результат 3 состоит в том, чтобы поместить каждый результат из результата массива 1 с каждым результатом из результата массива 2 и показать их следующим образом ( , ). и большое спасибо за ответ, я попробую то, что вы опубликовали сейчас.
Большое спасибо за помощь, но если можно, Джерри, я хочу спросить вас еще раз, можете ли вы объяснить мне более подробно, как именно вы нашли проблему и код? :)
Это сработало без вашего редактирования в 4 петлях результата 3? разве это не странно? :D
Когда вы сказали, что конец ваших массивов пуст, я скопировал ваш код в консольное приложение, поставил точку останова после построения result1 и заметил, что он также пуст в конце массива. Потом до меня дошло, в чем проблема.
Это определенно сработает до редактирования, но консоль будет повторять result[i, j] для каждой итерации k & m.
Хорошо, у меня есть еще один вопрос, потому что, как я уже говорил, я пытаюсь поместить все эти значения в результат 3, как я уже упоминал ранее, вот так (x, y), тогда я должен получить максимальное значение каждой точки этого (x, y) для всех точек затем получите минимальное значение максимальных значений, мне удалось получить максимальные значения, но когда я пытаюсь получить минимальное из них, оно показывает ноль.
Я предлагаю вам начать новый вопрос и опубликовать код, который вы используете для этого. Постарайтесь очень четко объяснить, чего вы пытаетесь достичь. Возможно, он лучше подходит для codereview.stackexchange.com
Попробуйте поместить свой код в dotnetfiddle.net, чтобы мы могли увидеть результат и понять, почему он не работает.