從矩陣/清單中取得不同項目的最快方法我試圖在一個相當大的向量中獲取不同的項目,我想知道是否有人知道比創建關聯數組更快的方法。 我嘗試了以下方法。
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));
其輸出為:
選擇1 = 1082;
選擇2=40914;
選擇3=5853;
選擇4=8001;
N 項(不同 1)= 211;
N 項(distinct2)= 211;
N 行(distinct3`) = 211;
N 項(distinct4)= 211;
*編輯* 好吧,絕對不要使用關聯數組,因為它不允許浮點鍵,它會舍入所有內容。 for 迴圈對於這個操作來說似乎相當慢,所以有人有更好的嗎?
回覆:從矩陣/清單中取得不同項目的最快方法不確定它的速度比較如何,但打字速度更快...
distinct = Design(times, <<LEVELS></LEVELS>
回覆:從矩陣/清單中取得不同項目的最快方法對於我測試過的大部分套件。 2^52 的縮放似乎是最快的(損失可以接受)。 感謝您的所有回饋。
回覆:從矩陣/清單中取得不同項目的最快方法很好地使用了摘要。
對於不同規模的問題,最佳解決方案可能不同;大量的設置開銷可能會在足夠大的問題上得到回報。
我正在研究如何將浮點數轉換為關聯數組的鍵,但只得出了涉及由數字組成的字串的較慢答案。
您可以將浮點數縮放為 +/- 2^52 之間的整數,並使用整數來索引關聯數組。 是的,2^52 不是 2^32 也不是 2^64。 JMP 使用的 8 位元組雙精確度浮點數有 52 位元小數維基百科。 這將是有損轉換,但可以保留大部分資訊。
回覆:從矩陣/清單中取得不同項目的最快方法這是您可能想嘗試的另一種選擇
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;
回覆:從矩陣/清單中取得不同項目的最快方法我使用關聯數組做了同樣的事情。 如您所注意到的,要處理小於零/具有多個小數位的數字,您需要先對資料進行取樣,找出合適的縮放因子,然後縮放向量的元素。
這似乎仍然比使用 for 循環更快,因為它是一些矩陣操作,然後創建關聯數組。