编辑 这回答了在给定 x,y ~ U[0,1] 的情况下对转换 f(x,y) -> t ~ U[0,1] 的原始请求,另外还用于 x 和 y 相关。更新后的问题专门询问希尔伯特曲线 H(x,y) -> t ~ U[0,1] 并且仅适用于 x,y ~ U[0,1] 所以这个答案不再相关。
考虑 [0,1] r1, r2, r3, ...中的随机均匀序列。您正在将此序列分配给数字对 (x1,y1), (x2,y2), .... 您在问什么for 是对 (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。您可以通过采用这种拉伸形式并将其旋转 theta 来引入相关性:
M2*M1*p = [cos(theta), sin(theta); -sin(theta), cos(theta)]*M1*p
将它们与 theta = pi/4 或 45 度放在一起,您可以看到较大的 y 值与较大的 x 值相关:
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 度角显示了一个均匀分布的数字带:
使用剪切可以进行进一步的变换,如果你很聪明,可以使用平移(OpenGL 使用 4x4 变换矩阵,因此平移可以表示为线性变换矩阵,在变换步骤之前添加一个额外的维度,并在完成之前删除) .
Mk*...*M1 p = p_prime
给定一个已知的仿射相关结构,您可以通过求解p从随机点 (x',y') 转换回点 (x,y),其中 x 和 y 在 [0,1] 中是独立的p = inv(Mk*...*M1) * p_prime
,在哪里p=[x;y]
。同样,只需选择 x,它将在 [0,1] 中是一致的。如果变换矩阵是奇异的,则这不起作用,例如,如果您将投影矩阵 Mj 引入混合(尽管如果投影是第一步,您仍然可以恢复)。
* 您可能会注意到绘图来自 python 而不是 matlab。我现在没有 matlab 或 octave 坐在我面前,所以我希望我的语法细节是正确的。