Удалить лишние точки на участке - PullRequest
0 голосов
/ 18 декабря 2018

Я пытаюсь построить функцию, которая имеет миллионы точек.Поэтому невозможно построить функцию, так как это может привести к сбою в работе моего компьютера.Тем не менее, весь график состоит из «колен», так как более чем одна переменная не может изменяться за раз.

Рассмотрим следующую матрицу

a = [1 2 3 4 4 4 4];
b = [1 1 1 1 2 3 4];

Эти точки дают следующий рисунок при использовании plot(a,b)

enter image description here

Однако, при ближайшем рассмотрении, я могу уменьшить свои векторы на график до

a = [1 4 4];
b = [1 1 4];

и получить то же самоеplot.

Мой вопрос: что такое векторизованный способ автоматического удаления каждой избыточной точки.Я мог бы легко пройтись и искать точки для удаления, но это было бы дорого.Я пытался использовать комбинации diff и cumsum, чтобы сделать это безрезультатно.У меня есть только прямые линии и прямые углы на графике, поэтому мне не нужно беспокоиться ни о чем виде ax+b

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

Вы можете использовать diff(diff(a))~=0, или эквивалентно diff(a, 2)~=0, чтобы получить, возможно, более чистое решение.Это будет работать независимо от того, подключите ли вы a или b к функции diff.

mat = [true, diff(a, 2)~=0, true];
a(mat)
 ans =
     1     4     4
b(mat)
 ans =
     1     1     4
0 голосов
/ 18 декабря 2018

Думаю, я отвечу на свой вопрос, если кому-то еще это понадобится.По сути, я делаю первый раз diff для каждой матрицы, чтобы увидеть, меняются ли значения между каждым элементом.Второй дифференциал ищет изменения.Поскольку мы ищем колено, мы в конечном итоге переключаемся с истинного на оси X на истинное на оси Y.Это то, что мы ищем.Затем мы добавляем на концах.Оттуда мы сохраняем только истинные элементы для нашей исходной матрицы.

mat = [true diff(logical(diff(a))-logical(diff(b))) true];
a(mat)
[1     4     4]
b(mat)
[1     1     4]

Я открыт для альтернативных предложений, поскольку это очень смешно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...