我想在Matlab中运行下面的实验,我请求帮助实现步骤(3)。任何建议都将不胜感激。
(1)考虑在X上均匀分布的随机变量Y[0,1]
(2)假设NX是独立的,从YX的联合分布中得出Y实现(意味着XY[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')

07-27 19:49