从矩阵/列表中获取不同项目的最快方法我试图在一个相当大的向量中获取不同的项目,我想知道是否有人知道比制作关联数组更快的方法。 我尝试了以下。
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;
选择 3 = 5853;
opt4 = 8001;
N 项(不同的 1)= 211;
N 项(distinct2)= 211;
N 行(distinct3`)= 211;
N 项(不同的 4)= 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 循环更快,因为它是一些矩阵操作,然后创建关联数组。