2017-08-31 63 views
1

我有一个矩阵,是的,A。在她的行上操作时,我经常需要创建“删除”向量。基本上如何在Chapel中生成基因敲除载体?

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))或其他语法。

+2

你能澄清一下你的意思吗?“只是为了这个计算”?你打算为每个淘汰赛创建临时阵列还是为每个淘汰赛修改“A”? – bencray

+0

如何使用类似于布尔覆盖掩码的想法(-ing - ) - {vector | array},这有助于“隐藏”**'A' **中的那些暂时被淘汰的(区域 - ) - 值? – user3666197

+0

@bencray我只需要获得值,下次我看看我将需要整行的行。举例来说,比较有/没有第三项的规范。 –

回答

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; 
} 

注:传阵列push_back()不礼拜堂1.15支持。它已被添加到 #7180