Yo gauss está trabajando en la comida rápida método. Como se señaló en el papel de la distribución de los partidos de la parte radial de la distribución normal. Para $d = 2$ es igual a la distribución de Rayleigh así que usted puede utilizar las implementaciones estándar de la muestra $s_i$. Para mayor sea el valor de d puede tomar muestras de una $d$ dimensional cero significa que la distribución gaussiana y, a continuación, calcular la longitud del vector aleatorio. Este método funciona bien en términos de corrección. Sin embargo, la generación de n muestras de la utilización de este método de las necesidades de $nd$ tiempo que es mucho mayor que el tiempo global de la complejidad de la comida rápida del algoritmo. Por lo tanto, está bien sólo para probar la exactitud del algoritmo.
Actualización: recientemente me di cuenta de que $s_i$ tiene distribución chi. Equivalentemente, se puede degustar de chi-cuadrado de distribución y calcular la raíz cuadrada de las muestras. Yo succsesfully probado en el Matlab y después de que usted puede encontrar el código fuente:
function [ ws ] = FF_samples( ndim, nsamples, sigm)
ws = [];
d = 2 ^ ceil(log2(ndim));
x = ceil(nsamples/d);
for bi = 1:x
I = eye(d);
B = diag(2*randi(2, d, 1) - 3);
H = hadamard(d);
P = I(randperm(d), :);
G = diag(normrnd(0,1, d, 1));
S = diag( chi2rnd(d,d,1) .^ .5) * sum(diag(G) .^ 2).^-.5;
%%
nws = (1/sigm / d)^.5 * S * H * G * P * H * B;
ws = [ws; nws];
end
ws = ws(1:nsamples, 1:ndim);
end
P. S.: todavía necesita algunas mejoras, puesto que yo no uso de la transformada rápida de Fourier como algoritmo para la multiplicación de la Hamard de la matriz a un vector.