我想在Matlab中运行下面的实验,我请求帮助实现步骤(3)。任何建议都将不胜感激。
(1)考虑在X
上均匀分布的随机变量Y
和[0,1]
。
(2)假设N
和X
是独立的,从Y
和X
的联合分布中得出Y
实现(意味着X
和Y
在[0,1]x[0,1]
上均匀地联合分布)每次抽签都在[0,1]x[0,1]
中。
(3)使用hilbert空间填充曲线对一个draw in[0,1]x[0,1]
中的每个drawin[0,1]
进行变换:在hilbert曲线映射下,drawin[0,1]x[0,1]
应该是[0,1]
中一个(或多个)点的图像。我想从这些要点中选一个。有没有在Matlab中预先构建的软件包来完成这项工作?
我找到了this答案,我认为它不符合我的要求,因为它解释了如何获得绘制的hilbert值(从曲线开始到拾取点的曲线长度)
在维基百科上,我发现C语言中的this代码(从(x,y)
到d
)同样不能满足我的问题。
最佳答案
我只关注你的最后一点
(3)使用hilbert空间填充曲线对一个draw in[0,1]x[0,1]
中的每个drawin[0,1]
进行变换:在hilbert曲线映射下,drawin[0,1]x[0,1]
应该是[0,1]
中一个(或多个)点的图像。我想从这些要点中选一个。有没有在Matlab中预先构建的软件包来完成这项工作?
据我所知,在Matlab中并没有预构建的包来完成这项工作,但好消息是wikipedia上的code可以从Matlab中调用,它就像在xy2d.c
文件中将转换例程与网关函数组合在一起一样简单:
#include "mex.h"
// source: https://en.wikipedia.org/wiki/Hilbert_curve
// rotate/flip a quadrant appropriately
void rot(int n, int *x, int *y, int rx, int ry) {
if (ry == 0) {
if (rx == 1) {
*x = n-1 - *x;
*y = n-1 - *y;
}
//Swap x and y
int t = *x;
*x = *y;
*y = t;
}
}
// convert (x,y) to d
int xy2d (int n, int x, int y) {
int rx, ry, s, d=0;
for (s=n/2; s>0; s/=2) {
rx = (x & s) > 0;
ry = (y & s) > 0;
d += s * s * ((3 * rx) ^ ry);
rot(s, &x, &y, rx, ry);
}
return d;
}
/* The gateway function */
void mexFunction( int nlhs, mxArray *plhs[],
int nrhs, const mxArray *prhs[])
{
int n; /* input scalar */
int x; /* input scalar */
int y; /* input scalar */
int *d; /* output scalar */
/* check for proper number of arguments */
if(nrhs!=3) {
mexErrMsgIdAndTxt("MyToolbox:arrayProduct:nrhs","Three inputs required.");
}
if(nlhs!=1) {
mexErrMsgIdAndTxt("MyToolbox:arrayProduct:nlhs","One output required.");
}
/* get the value of the scalar inputs */
n = mxGetScalar(prhs[0]);
x = mxGetScalar(prhs[1]);
y = mxGetScalar(prhs[2]);
/* create the output */
plhs[0] = mxCreateDoubleScalar(xy2d(n,x,y));
/* get a pointer to the output scalar */
d = mxGetPr(plhs[0]);
}
用
mex('xy2d.c')
编译它。上述实施
[…]假设一个正方形被n个单元格分成n,n的幂为2,坐标为整数,左下角为(0,0),右上角为(n-1,n-1)。
实际上,在应用映射之前需要离散化步骤在每一个离散化问题中,明智地选择精度是至关重要的下面的片段将所有内容组合在一起。
close all; clear; clc;
% number of random samples
NSAMPL = 100;
% unit square divided into n-by-n cells
% has to be a power of 2
n = 2^2;
% quantum
d = 1/n;
N = 0:d:1;
% generate random samples
x = rand(1,NSAMPL);
y = rand(1,NSAMPL);
% discretization
bX = floor(x/d);
bY = floor(y/d);
% 2d to 1d mapping
dd = zeros(1,NSAMPL);
for iid = 1:length(dd)
dd(iid) = xy2d(n, bX(iid), bY(iid));
end
figure;
hold on;
axis equal;
plot(x, y, '.');
plot(repmat([0;1], 1, length(N)), repmat(N, 2, 1), '-r');
plot(repmat(N, 2, 1), repmat([0;1], 1, length(N)), '-r');
figure;
plot(1:NSAMPL, dd);
xlabel('# of sample')