Представляет собой вектор с двойными значениями. Я хочу знать, какие расстояния между любыми элементами этого вектора имеют одинаковое расстояние друг к другу. В лучшем случае результатом является вектор подмножеств исходных значений, где подмножества должны иметь не менее n членов.Найдите аналогичные расстояния между всеми значениями в векторном и подмножестве
//given
vector<double> values = {1,2,3,4,8,10,12}; //with simple values as example
//some algorithm
//desired result as:
vector<vector<double> > subset;
//in case of above example I would expect some result like:
//subset[0] = {1,2,3,4}; //distance 1
//subset[1] = {8,10,12}; //distance 2
//subset[2] = {4,8,12}; // distance 4
//subset[3] = {2,4}; //also distance 2 but not connected with subset[1]
//subset[4] = {1,3}; //also distance 2 but not connected with subset[1] or subset[3]
//many others if n is just 2. If n is 3 (normally the minimum) these small subsets should be excluded.
Этот пример упрощается, поскольку расстояния целых чисел могут быть итеративны и испытаны для вектора, который не относится к двойному или поплавку.
Моя идея до сих пор
Я думал, что-то вроде вычисления расстояния и хранить их в векторе. Создание матрицы разностных расстояний и порог этой матрицы для некоторого допуска для аналогичные расстояния.
//Calculate distances: result is a vector
vector<double> distances;
for (int i = 0; i < values.size(); i++)
for (int j = 0; j < values.size(); j++)
{
if (i >= j)
continue;
distances.push_back(abs(values[i] - values[j]));
}
//Calculate difference of these distances: result is a matrix
Mat DiffDistances = Mat::zero(Size(distances.size(), distances.size()), CV_32FC1);
for (int i = 0; i < distances.size(); i++)
for (int j = 0; j < distances.size(); j++)
{
if (i >= j)
continue;
DiffDistances.at<float>(i,j) = abs(distances[i], distances[j]);
}
//threshold this matrix with some tolerance in difference distances
threshold(DiffDistances, DiffDistances, maxDistTol, 255, CV_THRESH_BINARY_INV);
//get points with similar distances
vector<Points> DiffDistancePoints;
findNonZero(DiffDistances, DiffDistancePoints);
На данный момент я застрял в поиске исходных значений, соответствующих моим аналогичным расстояниям. Их должно быть возможно найти, но, похоже, очень сложно отследить индексы, и мне интересно, нет ли более простого способа решить проблему.
Я не уверен, понимаю ли я, что вы хотите получить в результате. Вы хотите иметь векторы, содержащие элементы, которые имеют аналогичное расстояние до некоторой другой точки (например, '{1.0, 2.0, 10.0, 11.0}' будут принадлежать одному подмножеству)?Что относительно '{1.0, 2.0, 10.1, 11.1, 20.2, 21.2}', когда ваш порог равен «0.11»? – jotasi
Я добавил пример в вопрос. В вашем предложенном случае я ожидал бы подмножество 1.0, 2.0 и 10.0, 11.0; или другой пример: 1.0, 2.0 и 10.1, 11.1 и 20.2, 21.2; Я думаю, что моя попытка решить проблему не будет учитывать эти случаи очень хорошо, поэтому это не очень сложное рабочее решение, а сложное и не идеально работающее решение. – Phann
Итак, вы хотите подключить подмножества с аналогичным расстоянием. И как вы хотите классифицировать расстояние как подобное? Мой пример выше был не совсем тем, что я хотел иметь (это должно быть «{1.0, 2.0, 10.0, 11.1, 20.0, 21.2}» или как связанный случай '{1.0 2.0 3.09 4.27}'). Я хочу знать, будет ли расстояние 1.0, 1.09, 1.18' схожим с порогом '0,1'. – jotasi