РедактироватьЭто отвечает на первоначальный запрос для преобразования Р (х, у) -> т ~ U [0,1] Данные х, у ~ U [0,1], а также для х и у коррелированы. В обновленном вопросе конкретно задана кривая Гильберта H (x, y) -> t ~ U [0,1] и только для x, y ~ U [0,1], поэтому этот ответ больше не имеет значения.
Рассмотрим случайную однородную последовательность в [0,1] r1, r2, r3, .... Вы назначаете эту последовательность парам чисел (x1, y1), (x2, y2), ... . То, о чем вы просите, является преобразованием на парах (x, y), которые дают равномерное случайное число в [0,1].
Рассмотрим случайную подпоследовательность r1, r3, ..., соответствующую x1, x2, .... Если вы полагаете, что ваш генератор чисел является случайным и некоррелированным в [0,1], то подпоследовательность x1, x2, ... также должны быть случайными и некоррелированными в [0,1]. Поэтому довольно простой ответ на первую часть вашего вопроса - это проекция на ось x или y. То есть просто выберите x.
Далее рассмотрим корреляции между x и y. Поскольку вы не указали природу корреляции, допустим простое масштабирование осей, , такое как x '=> [0, 0.5], y' => [0, 3.0], за которым следует поворот. Масштабирование не вводит никакой корреляции, поскольку x 'и y' все еще независимы. Вы можете генерировать его достаточно легко с умножением матрицы:
M1*p = [x_scale, 0; 0, y_scale] * [x; y]
для матрицы M1 и точки p. Вы можете ввести корреляцию, приняв эту растянутую форму и вращая ее тета:
M2*M1*p = [cos(theta), sin(theta); -sin(theta), cos(theta)]*M1*p
Собираем все вместе с тета = пи/4, или 45 градусов, вы можете увидеть, что большие значения у коррелируют с более крупными значения х:
cos_t = sin_t = cos(pi/4); % at 45 degrees, sin(t) = cos(t) = 1/sqrt(2)
M2 = [cos_t, sin_t; -sin_t, cos_t];
M1 = [0.5, 0.0; 0.0, 3.0];
p = random(2,1000);
p_prime = M2*M1*p;
plot(p_prime(1)', p_prime(2)', '.');
axis('equal');
Полученный участок * показывает полосу, равномерно распределенных чисел под углом 45 градусов:
![correlated uniform random numbers](https://i.stack.imgur.com/bruU9.png)
Возможны дальнейшие преобразования с сдвигом, и если вы умны в этом отношении, перевод (OpenGL использует матрицы преобразования 4x4, так что перевод может быть представлен как матрица линейного преобразования, с дополнительным размером, добавленным до шагов преобразования и удаляемым до того, как они сделано).
Для известной аффинной корреляционной структуры вы можете преобразовать обратно из случайных точек (x ', y') в точки (x, y), где x и y независимы в [0,1], решая Mk*...*M1 p = p_prime
для p, или, что то же самое, путем установки p = inv(Mk*...*M1) * p_prime
, где p=[x;y]
. Опять же, просто выберите x, который будет равномерным в [0,1]. Это не работает, если матрица преобразования является сингулярной, например, если вы представляете матрицу проекций Mj в микс (хотя, если проекция является первым шагом, вы все равно сможете восстановить).
* Вы можете заметить, что участок находится от python, а не от matlab. У меня сейчас нет перекладины MATLAB или октавы, поэтому я надеюсь, что я правильно понял синтаксические данные.
Я уточнил свой вопрос, потому что из ответов я понял, что не ясно, что я действительно хочу использовать кривые заполнения пространства. – user3285148
Обратите внимание, что мне не нужно заканчивать одномерным равномерным распределением в [0,1]. – user3285148
Если вам действительно нужно построить кривую Гильберта, пожалуйста, проигнорируйте мой ответ. Просто из любопытства, почему вы должны использовать кривую Гильберта в своей проблеме? На какой вопрос вы пытаетесь ответить? –