如何在 Chapel 中生成敲除载体?
How to generate knock-out vectors in Chapel?
我有一个矩阵,是的,A
。对她的行进行操作,我经常需要创建 "knock-out" 个向量。基本上
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||
}
==更新==
关于 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))
或另一种语法。
我不知道这样做的好方法 "in-place" 这样就没有临时数组
已创建。
目前,这是一种通过创建临时数组来删除索引的方法:
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.
我有一个矩阵,是的,A
。对她的行进行操作,我经常需要创建 "knock-out" 个向量。基本上
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||
}
==更新==
关于 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))
或另一种语法。
我不知道这样做的好方法 "in-place" 这样就没有临时数组 已创建。
目前,这是一种通过创建临时数组来删除索引的方法:
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.