2017-01-29 3 views
0

У меня есть двойной вектор:Представляя близость между элементами двойного вектора

r = -50 + (50+50)*rand(10,1) 

Теперь я хочу, чтобы в идеале все числа в векторе равных ДО допуска сказать 1e-4. Я хочу представить каждый r со скаляром, скажем s(r), так что его значение дает представление о качестве вектора. Вектор является высоким качеством, если все элементы в векторе равны. Я могу легко запустить for петлю как

for i=1:10 
for j=i+1:10 
    check equality upto the tolerance 
end 
end 

Но даже тогда я не могу понять, что вычисление сделать внутри вложенной для петель присвоить скаляр, представляющий качество. Есть ли лучший способ такой, что для любого вектора r длина n, я могу быстро вычислить скаляр, представляющий качество вектора.

ответ

1

Ваш двойной цикл алгоритма несколько медленный, порядка O (n ** 2), где n - число измерений вектора. Вот быстрый способ найти близость векторных элементов, что можно сделать в порядке O (n), только один проход через элементы.

Найти максимум и минимум элементов вектора. Просто используйте две переменные, чтобы сохранить максимум и минимум до сих пор и запускать один раз через все элементы. Разность между максимумом и минимумом называется range значений, общепринятых measure of dispersion значений. Если значения в точности равны, диапазон равен нулю, что показывает идеальное качество. Если диапазон ниже 1e-4, тогда вектор имеет приемлемое качество. Чем больше диапазон, тем хуже равенство.

Код очевиден для любого конкретного языка, поэтому я оставлю это вам. Если тот факт, что диапазон действительно учитывает только два крайних значения вектора, беспокоит вас, вы можете использовать другие меры изменения, такие как межквартильный диапазон, дисперсия или стандартное отклонение. Но диапазон, кажется, наилучшим образом соответствует тому, что вы просите.

Смежные вопросы