如何在Chapel中生成敲除载体?

时间:2017-08-31 23:39:39

标签: chapel

我有一个矩阵,是的,A。在她的行上操作,我经常需要创建"淘汰"向量。基本上

var v = [5, 4, 3, 2, 1];
v_{-2} = [5, 3, 2, 1]; // e.g. v[2] is removed

我不想永久删除它,仅用于此计算,我想沿着A的行进行。

var knockouts: [A.dim(1)] int;  // list of knockout dims, as tall as A
for i in A.dim(1) {
  var w = ||v_{-knockouts[i]}|| / ||v||
}

== UPDATE ==

更多关于A以保持一般性。它非常大而且(我的常规)稀疏。被淘汰的元素预计将在人口密集的子域内,但在某些情况下可能不会。这些条目通常是概率,如stochastic matrix中所示,因此一些常见的行操作是

r = A[i,..]
s = r[3] / sum(r_{-3})
s = sum(r[3] log(r_{-3}))
s = sum(log (r_{-3})) / sum (log (r_{-5}))

在进行所有日志记录后,设置r[3] = 0可能不安全。但是,如果这是解决方案,那么有一个便利功能来完成这项工作仍然是件好事。我不记得看过一个,但可能是sum(r.except(3))或其他语法。

1 个答案:

答案 0 :(得分:1)

我不知道这样做“就地”的好方法,这样就没有临时数组了 是创造的。

目前,这是一种通过创建临时数组来敲除索引的方法:

var v = [5, 4, 3, 2, 1];
writeln(exclude(v, 2));     // 5 3 2 1
writeln(exclude(v, 3));     // 5 4 2 1


/* Returns array with element at idx excluded */
proc exclude(A: [], idx) {
  var v1 = A[..idx-1];
  v1.push_back(A[idx+1..]); // See NOTE
  return v1;
}

注意: Chapel 1.15不支持将数组传递到push_back()。它已被添加进去 #7180