在 PARI/GP 中查找向量条目?
Finding entry of vector in PARI/GP?
使用 PARI/GP,如果我有一个包含唯一条目的向量:
a = [9, 7, 3, 5, 2, 8, 1, 0, 11]
如何获取向量中条目的位置(索引)a
?
喜欢:
i = vectorsearch(a, 8);
a[i]
%1 = 8
转换成集合并使用 setsearch
不起作用!
只需执行 select((x) -> x == 8, a, 1)
,其中标记 1
表示 "index mode"。一般情况下,你的功能如下图。
position = (elt, array) -> select((x) -> x == elt, array, 1);
请注意,尽管这个东西对数组的每个元素执行 lambda 调用,但效率非常高。这为 small/big 数组带来了不错的 运行 时间。
为了证明效率,我们做了简单的性能测试来评估 position
和它的 DIY 竞争对手,只寻找第一次出现的位置。
position1 = (elt, array) -> for(i = 1, #array, if(array[i] == el, return(i)));
a = vector(100, i, random(200));
{ gettime(); for(i = 1, 10^4, position(8, a)); gettime() }
{ gettime(); for(i = 1, 10^4, position1(8, a)); gettime() }
对于 PARI/GP 2.7.2 运行ning 在 Windows 8 64 位,Intel i7-4702MQ CPU @ 2.20GHz[=15],这相应地给出了 87ms 和 198ms =]
你可以试试:
position = select(x->x==8,a,1)[1];
使用 PARI/GP,如果我有一个包含唯一条目的向量:
a = [9, 7, 3, 5, 2, 8, 1, 0, 11]
如何获取向量中条目的位置(索引)a
?
喜欢:
i = vectorsearch(a, 8);
a[i]
%1 = 8
转换成集合并使用 setsearch
不起作用!
只需执行 select((x) -> x == 8, a, 1)
,其中标记 1
表示 "index mode"。一般情况下,你的功能如下图。
position = (elt, array) -> select((x) -> x == elt, array, 1);
请注意,尽管这个东西对数组的每个元素执行 lambda 调用,但效率非常高。这为 small/big 数组带来了不错的 运行 时间。
为了证明效率,我们做了简单的性能测试来评估 position
和它的 DIY 竞争对手,只寻找第一次出现的位置。
position1 = (elt, array) -> for(i = 1, #array, if(array[i] == el, return(i)));
a = vector(100, i, random(200));
{ gettime(); for(i = 1, 10^4, position(8, a)); gettime() }
{ gettime(); for(i = 1, 10^4, position1(8, a)); gettime() }
对于 PARI/GP 2.7.2 运行ning 在 Windows 8 64 位,Intel i7-4702MQ CPU @ 2.20GHz[=15],这相应地给出了 87ms 和 198ms =]
你可以试试:
position = select(x->x==8,a,1)[1];