Если вы просто пытаетесь удалить соседние значения в пределах этого допуска от вектора, я хотел бы начать с чем-то вроде этого:
roc = ...
tolerance = 0.1;
idx = [logical(1) diff(roc)>tolerance)];
rocReduced = roc(idx);
«rocReduced» теперь вектор со всеми значениями, которые Ждут» t имеют смежные значения в пределах допуска в исходном векторе.
Этот подход имеет два различных ограничения:
- оригинальный вектор «Рух» должен быть монотонным.
- Не более двух элементов в строке может находиться в пределах допуска, в противном случае весь участок будет удален.
Я подозреваю, что вышеуказанного будет недостаточно. Тем не менее, я не могу думать о каких-либо простых операциях, которые преодолевают эти (и другие) ограничения при использовании векторизованных матричных операций.
Если производительность не является большой проблемой, вы, возможно, следующий итерационный алгоритм подойдет приложение:
roc = ...
tolerance = 0.1;
mask = true(size(roc)); % Start with all points
last = 1; % Always taking first point
for i=2:length(roc) % for all remaining points,
if(abs(roc(i)-roc(last))<tolerance) % If this point is within the tolerance of the last accepted point, remove it from the mask;
mask(i) = false;
else % Otherwise, keep it and mark the last kept
last = i;
end
end
rocReduced = roc(mask);
Это обрабатывает несколько последовательных интервалов суб-допуска, не обязательно бросать все прочь. Он также обрабатывает немонотонные последовательности.
Пользователи MATLAB иногда уклоняются от итерационных решений (по сравнению с векторизованными матричными операциями), но иногда не стоит искать более элегантное решение, когда производительность грубой силы соответствует вашим потребностям.
Что делать, если у вас есть целая цепь ценностей? Например. ваша матрица содержит 0, .005, .01, .015, .02, .025 и т. д. Первая эквивалентна второй, второй и третьей и т. д. Это означает, что все они эквивалентны, но это, вероятно, не то, что вы хотите, не так ли? – balpha
Должно ли это масштабироваться для матриц любого числа измерений или оно каким-то образом ограничено? Когда вы говорите «удалить», это заставляет меня думать, что оставшаяся матрица будет скудной. Это правильно или проще? –
Матрицы, с которыми я работаю сейчас, будут иметь заданный 2D размер (они в конечном итоге достигают 10 000 × 10 000). Наверное, я недостаточно объяснил удаляющую часть, хотя теперь, когда я думаю об этом, я сначала помещал все свои матричные значения в вектор. Затем мне нужно пройти через вектор и удалить любые значения, которые отличаются менее чем на 0,01 (если они отличаются менее чем на 0,01, я предполагаю, что они имеют одинаковое значение) – 2009-07-01 18:33:59