Inicializar datos en varias columnas a la vezEstoy interesado en inicializar datos en varias columnas de la misma manera, todo a la vez.Por ejemplo, quiero crear un número M de columnas con datos aleatorios normales (media = x, desviación estándar = y), a través de N filas.Cualquier ayuda es apreciada.Gracias.
Tabla de datossecuencias de comandosRe: Inicializar datos en varias columnas a la vezBasado en la información limitada provista, este script prueba el concepto.
Names Default to Here( 1 );
M = 10;
N = 30;
data = J( N, M, Random Normal() );
As Table( data );
Re: Inicializar datos en varias columnas a la vezAgregando a lo que proporcionó Mark: Random Normal ( ) se puede usar sin argumentos o con 2 argumentos.
Sin argumentos, obtiene N(media == 0, stddev == 1) datos. Entonces, el código de Mark le dará una tabla MxN de N(0,1) datos.
Usando argumentos, Random Normal ( x, y ) le da N (media == x, stddev == y) datos.
Dado que su publicación menciona una media de x y una desviación estándar de y, podría usar lo siguiente, si x no es 0 y/o y no es 1.
As Table ( J ( N, M, Random Normal ( x, y ) );
Re: Inicializar datos en varias columnas a la vezAquí hay una cosa divertida:
Puede ahorrar un poco de tiempo usando
y * J ( M, N, normal aleatorio () ) + x
en lugar de
J( M, N, aleatorio normal (x, y) ).
La razón es que la función J es realmente un bucle...por lo tanto, en el ejemplo de J( M, N, randomnormal (x, y) ), cada vez que se pasa por el bucle se elige una normal aleatoria estándar, se multiplica por y y se suma ax para producir una N(x, y) aleatoria.
En el ejemplo y * J (M, N, randomNormal ()) + x, se generan todas las normales aleatorias estándar, y luego toda la matriz se multiplica por y y se suma a una matriz x dimensionalmente similar.
No es una gran diferencia, pero en las matrices de 1000x1000 que estaba investigando, el segundo enfoque se ejecutó en aproximadamente 3/4 del tiempo del primero.
Re: Inicializar datos en varias columnas a la vezEl tiempo adicional se dedica a buscar los valores de x e y 999 999 veces adicionales, no en la multiplicación real que debe hacerse de todos modos. Puede usar números en lugar de x,y y obtener un intervalo de tiempo porque el número se evalúa sin búsqueda en el espacio de nombres. El caso de referencia a continuación no incluye la multiplicación y la suma, lo que probablemente daría una respuesta más cercana a los 3/4 que describiste.
q=j(size,size,randomnormal()); // 1.0
q=j(size,size,randomnormal(0,1)); // 1.1
q=j(size,size,randomnormal(x,y)); // 1.4