Inizializza i dati su più colonne contemporaneamenteSono interessato a inizializzare i dati su più colonne nello stesso modo tutto in una volta.Ad esempio, voglio creare un numero M di colonne con dati casuali normali (media = x, stdev = y), attraverso N righe.Qualsiasi aiuto è apprezzato.Grazie.
Tabella datiScriptingRi: inizializzare i dati su più colonne contemporaneamenteSulla base delle informazioni limitate fornite, questo script dimostra il concetto.
Names Default to Here( 1 );
M = 10;
N = 30;
data = J( N, M, Random Normal() );
As Table( data );
Ri: inizializzare i dati su più colonne contemporaneamenteIn aggiunta a quanto fornito da Mark: Random Normal ( ) può essere utilizzato senza argomenti o con 2 argomenti.
Senza argomenti, ottieni N(mean == 0, stddev == 1) dati. Quindi il codice di Mark ti darà una tabella MxN di dati N (0,1).
Utilizzando gli argomenti, Random Normal ( x, y ) fornisce dati N( mean == x, stddev == y).
Poiché il tuo post menziona una media di x e uno stddev di y, potresti usare quanto segue, se x non è 0 e/o y non è 1.
As Table ( J ( N, M, Random Normal ( x, y ) );
Ri: inizializzare i dati su più colonne contemporaneamenteEcco una cosa divertente:
Potresti risparmiare un po 'di tempo usando
y * J ( M, N, randomNormal () ) + x
invece di
J( M, N, randomnormal (x, y) ).
Il motivo è che la funzione J è in realtà un ciclo...quindi nell'esempio J( M, N, randomnormal (x, y) ), ogni volta attraverso il ciclo viene scelta una normale casuale standard, moltiplicata per y e aggiunta a x per produrre una N(x, y) casuale.
Nell'esempio y * J ( M, N, randomNormal () ) + x, vengono generate tutte le normali casuali standard, quindi l'intera matrice viene moltiplicata per y e aggiunta a una matrice x dimensionalmente simile.
Non è una differenza enorme, ma nelle matrici 1000x1000 che stavo studiando, il secondo approccio ha funzionato in circa 3/4 del tempo del primo.
Ri: inizializzare i dati su più colonne contemporaneamenteIl tempo extra viene impiegato per cercare i valori di x e y 999.999 volte in più, non nella moltiplicazione effettiva che deve essere eseguita comunque. È possibile utilizzare i numeri al posto di x, y e ottenere un tempo intermedio perché il numero viene valutato senza ricerca nello spazio dei nomi. Il caso di riferimento di seguito non include la moltiplicazione e l'addizione che probabilmente otterrebbero una risposta più vicina ai 3/4 che hai descritto.
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