一度に複数の列のデータを初期化する複数の列にまたがるデータを一度に同じ方法で初期化することに興味があります。たとえば、ランダムな正規データ (平均 = x、stdev = y) を含む M 個の列を N 行で作成したいとします。どんな助けでも大歓迎です。ありがとう。
データ表スクリプティングRe: 一度に複数の列にまたがるデータを初期化する提供された限られた情報に基づいて、このスクリプトは概念を証明します。
Names Default to Here( 1 );
M = 10;
N = 30;
data = J( N, M, Random Normal() );
As Table( data );
Re: 一度に複数の列にまたがるデータを初期化するマークが提供したものに追加する: Random Normal ( ) は、引数なしで、または 2 つの引数とともに使用できます。
引数がなければ、N( mean == 0, stddev == 1) データを取得します。 したがって、Mark のコードは、N(0,1) データの MxN テーブルを提供します。
引数を使用すると、Random Normal ( x, y ) は N( mean == x, stddev == y) データを提供します。
あなたの投稿では x の平均と y の stddev について言及しているため、x が 0 でない場合、および/または y が 1 でない場合は、次を使用できます。
As Table ( J ( N, M, Random Normal ( x, y ) );
Re: 一度に複数の列にまたがるデータを初期化するここに面白いことがあります:
を使用すると、少し時間を節約できます
y * J (M, N, randomNormal () ) + x
それ以外の
J( M, N, ランダムノーマル (x, y) ).
その理由は、J 関数が実際にはループだからです...したがって、J( M, N, randomnormal (x, y) ) の例では、ループを通過するたびに、標準のランダム法線が選択され、y で乗算され、x に加算されて、ランダム N(x, y) が生成されます。
y * J ( M, N, randomNormal () ) + x の例では、すべての標準ランダム法線が生成され、その後、行列全体が y で乗算され、次元的に類似した x 行列に追加されます。
大きな違いではありませんが、私が調査していた 1000x1000 のマトリックスでは、2 番目のアプローチは最初のアプローチの約 3/4 で実行されました。
Re: 一度に複数の列にまたがるデータを初期化する余分な時間は、とにかく実行しなければならない実際の乗算ではなく、x と y の値を 999,999 回余分に検索するために費やされます。 x,y の代わりに数値を使用して、その間の時間を取得できます。これは、数値が名前空間でルックアップなしで評価されるためです。 以下のベースライン ケースには、説明した 3/4 に近い答えが得られる可能性が高い乗算と加算が含まれていません。
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