Билинейная интерполяция на больших массивах в Java - PullRequest
0 голосов
/ 13 октября 2011

Я использую класс Java InterpolationBilinear, чтобы помочь мне изменить выборку массива.Мой текущий (и относительно небольшой) тестовый пример превращает массив 10x10 в массив 20x20.Моя проблема заключается в том, что метод interpolate(double[][], float x, float y) в этом классе выполняет только передискретизацию верхнего левого угла двумерного массива, который я ему отправляю (0x0, 0x1, 1x0, 1x1).

В настоящее время он выглядит так, как будто яПридется написать некоторый код для отправки методу интерполяции набора массивов 2х2 вместо всего массива.Кажется, есть лучший способ, какие-нибудь советы?

Я не заинтересован в использовании сторонних библиотек, только стандартный Java и код, который я могу написать сам.

Спасибо!

1 Ответ

1 голос
/ 13 октября 2011

Вот что должен делать класс InterpolationBilinear. См. документацию . Единственное, что он делает, это реализует билинейную интерполяцию между четырьмя точками, расположенными в прямоугольнике. Формула объяснена здесь , и вы также можете легко реализовать ее самостоятельно.

Вопрос в том, что такое float x и float y в вашем примере? Для InterpolationBilinear.interpolate они должны представлять дробное положение между четырьмя углами образца прямоугольника.

Или вы хотите, чтобы float x и float y представляли номера элементов в вашем массиве? например (4.3,7.1) будет означать интерполяцию между элементами (4,7), (4,8), (5,7) и (5,8)? Тогда да, вам просто нужно вставить эти четыре значения в interpolate (или вашу собственную реализацию этой простой формулы) вместе с дробными позициями 0,3 в х и 0,1 в у.

РЕДАКТИРОВАТЬ Теперь вы пояснили, что x и y должны представлять дробную позицию в массиве , назовем его raw[][] и предположим, что это 10 x 10 т.е. индексы идут от 0 до 9 в обоих измерениях.

Для интерполяции в (x,y) вам просто нужно найти, в какую клетку попадает (x,y), и интерполировать между четырьмя углами. В направлении х индексы будут представлять собой целые числа непосредственно выше и ниже x*9, т.е. Math.floor(x*9) и Math.floor(x*9) + 1 - то же самое у, но с y*9. Теперь у вас есть четыре угла. Включите их в формулу. Дробная позиция будет что-то вроде xfrac = x*9 - Math.floor(x*9) и yfrac = y*9 - Math.floor(y*9). Включите их в формулу.

Это должно повторяться для каждой точки в вашем целевом массиве. Обратите внимание, что x в приведенном выше абзаце будет равно i/19, а y равно j/19, где i и j - индексы целевого массива.

...