так что у меня есть массив [пm] и мне нужно кодировать в c ++ евклидово расстояние между каждой строкой и другими строками в массиве и сохранять его в новом массиве расстояний [nn] значение каждой ячейки которого равно расстоянию между пересекающимися строками.
Расстояние-массив:
r0 r1 .....rn
r0 0
r1 0
. 0
. 0
rn 0
Евклидово расстояние между буксирными рядами или буксирными записями составляет:
Предположим, у нас есть следующие записи:
r0: 1 8 7
r1: 2 5 3
r2
.
.
rn
Евклидово расстояние между r0 и r1 = sqrt ((1-2) ^ 2 + (8-5) ^ 2 + (7-3) ^ 2)
чтобы закодировать это, я использовал 4 цикла (что я считаю слишком много), но я не мог сделать это правильно, может кто-нибудь помочь мне кодировать это без использования 3-D массива ??
это мой код:
int norarr1[row][column] = { 1,1,1,2,2,2,3,3,3 };
int i = 0; int j = 0; int k = 0; int l = 0;
for (i = 0; i < column; i++){
for(j = 0; j < column; j++){
sumd = 0;
for (k = 0; k < row; k++) {
for (l = 0; l < row; l++) {
dist = sqrt((norarr1[i][k] - norarr1[j][l]) ^ 2);
sumd = sumd + dist;
cout << "sumd =" << sumd << " ";
}
cout << endl;
}
disarr[j][i] = sumd;
disarr[i][j] = sumd;
cout << disarr[i][j];
}
cout << endl;
}
Есть несколько проблем с вашим кодом. А пока давайте проигнорируем циклы for. Мы вернемся к этому позже.
Первое, что ^
является побитовым эксклюзивным или (XOR) оператором. Это не делает возведение в степень, как в некоторых других языках. Вместо этого вам нужно использовать std::pow()
,
Во-вторых, вы суммируете квадратные корни, что не является правильным способом вычисления евклидова расстояния. Вместо этого вам нужно рассчитать сумму, а затем взять квадратный корень.
Теперь давайте подумаем о циклах for. Предположим, что вы уже знаете, между какими двумя строками вы хотите рассчитать расстояние. Позвоните этим r1
а также r2
, Теперь вам просто нужно связать одну координату из r1
с одной координатой из r2
, Обратите внимание, что эти координаты всегда будут в одном столбце. Это означает, что вам нужно только одна петля рассчитать квадраты разностей каждой пары координат. Затем вы складываете эти квадраты. в заключение после этого единственного цикла вы берете квадратный корень.
После этого нам нужно перебирать строки, чтобы выбрать r1
а также r2
, Хорошо, это займет два цикла, так как мы хотим, чтобы каждый из них принимал значение каждой строки.
Всего нам понадобится три петли. Вы можете сделать это проще для понимания, хорошо разработав свой код. Например, вы можете создать класс или структуру, которая содержит каждую строку. Если вы знаете, что каждая строка имеет только три измерения, то создайте point
или же vector3
учебный класс. Теперь вы можете написать функцию, которая вычисляет расстояние между двумя точками. Наконец, сохраните список точек в виде одномерного массива. Фактически, разбивка данных и вычисление таким образом делает предыдущее обсуждение о расчете расстояния еще проще для понимания.
Других решений пока нет …