マトリックス/リストから個別のアイテムを取得する最速の方法かなり大きなベクトルで個別のアイテムを取得しようとしていますが、連想配列を作成するよりも速い方法を誰かが知っているかどうか疑問に思っていました。 以下を試しました。
Names Default to here(1);
dt = open("$SAMPLE_DATA\Probe.jmp");
rows = dt << Get rows Where(Num(:Wafer Number) <= 10);
times = Column(dt, "Start Time")[rows];
//option 1
st = HPTime();
distinct1 = associative array(as list(times));
distinct1 = distinct1 << Get Keys;
opt1 = HPTime()-st;
show(opt1);
//option 2
st = HPTime();
dt_sub = dt << Subset(
Selected Rows( 0 ),
Rows( rows ),
Selected columns only( 0 )
);
Summarize(dt_sub, distinct2 = by(:Start Time));
close(dt_sub, no save);
opt2 = HPTime()-st;
show(opt2);
//option 3
st = HPTime();
distinct3 = [];
for(i=1, i<=nrows(times), i++,
if(!any(distinct3 == times[i]),
distinct3 ||= times[i]
)
);
opt3 = HPTime()-st;
show(opt3);
//option 4
st = HPTime();
distinct4 = {};
for(i=1, i<=nrows(times), i++,
if(!Contains(distinct4, times[i]),
insert into(distinct4, times[i])
)
);
opt4 = HPTime()-st;
show(opt4);
show(nitems(distinct1), nitems(distinct2), nrows(distinct3`), nitems(distinct4));
次の出力が得られました。
opt1 = 1082;
opt2 = 40914;
opt3 = 5853;
opt4 = 8001;
N 個のアイテム (distinct1) = 211;
N 個のアイテム (distinct2) = 211;
N 行 (distinct3`) = 211;
N 個のアイテム (distinct4) = 211;
*編集* さて、連想配列は絶対に使用しないでください。連想配列は浮動小数点キーを許可しないため、すべてを丸めます。 この操作では for ループがかなり遅いように見えるので、他に何か良いものはありますか?
Re: マトリックス/リストから個別のアイテムを取得する最速の方法速度がどのように比較されるかはわかりませんが、入力する方が高速です...
distinct = Design(times, <<LEVELS></LEVELS>
Re: マトリックス/リストから個別のアイテムを取得する最速の方法私がテストしたほとんどのセットについて。 2^52 によるスケーリングが最速のようです (損失は許容範囲内)。 すべてのフィードバックに感謝します。
Re: マトリックス/リストから個別のアイテムを取得する最速の方法まとめの上手な使い方。
最適なソリューションは、問題のサイズによって異なる場合があります。大きなセットアップのオーバーヘッドは、十分に大きな問題で報われるかもしれません。
浮動小数点数を連想配列のキーに変換する方法を調査していましたが、数値から作成された文字列を含む遅い答えしか思いつきませんでした。
浮動小数点数を +/- 2^52 の整数にスケーリングし、その整数を使用して連想配列にインデックスを付けることができます。 はい、2^32 ではなく 2^64 ではなく 2^52 です。 JMPが使用する8バイトの倍精度浮動小数点数には、52ビットの小数があります。ウィキペディア. これは損失の多い変換になりますが、ほとんどの情報を保持できます。
Re: マトリックス/リストから個別のアイテムを取得する最速の方法ここにあなたが試してみたいかもしれない別の選択肢があります
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA\Probe.jmp" );
dt << Select Where( Num( :Wafer Number ) > 10 );
dt << exclude;
dtSumm = dt << Summary(
private,
Group( :Start Time ),
Freq( "None" ),
Weight( "None" ),
statistics column name format( "column" ),
Link to original data table( 0 )
);
dtSumm << delete rows;
Distinct = dtSumm:Start Time << get values;
Close( dtSumm, nosave );
dt << clear row states;
Re: マトリックス/リストから個別のアイテムを取得する最速の方法連想配列を使用して同じことを行いました。 お気づきのように、ゼロ未満の数値/小数点以下の桁数が多い数値を処理するには、最初にデータのサンプルを取得し、適切なスケーリング係数を見つけてから、ベクトルの要素をスケーリングする必要があります。
連想配列を作成する前に行列を少し操作するだけなので、for ループを使用するよりも高速に動作するように見えます。