2017-08-31 4 views
1

私はマトリックスがあります、はい、Aです。彼女の行を操作して、私はしばしば "ノックアウト"ベクターを作成する必要があります。基本的にはチャペルでノックアウトベクターを生成する方法は?

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

私はこの計算のために、恒久的に削除したくない、と私はAの行に沿って、それをやりたいです。 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 ==

より一般的な、それを維持します。それは非常に大きく、(私のように)疎です。ノックアウトされた要素は、サブポピュレートされたサブドメイン内にあると予想されますが、場合によってはそうではない可能性があります。エントリーは、多くの場合、いくつかの共通の行の操作はすべてのログが起こっていると

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を設定するのは安全ではないかもしれないが、stochastic matrixのように、確率です。しかし、それが解決策であるならば、それをカバーの下で行うための便利な機能を持たせることは、まだ良いことです。私は1つを見ることを思い出しませんが、おそらくまたは別の構文です。

+2

"この計算のためだけに"という意味を明確にすることはできますか?ノックアウトごとに一時的な配列を作成するか、ノックアウトごとに 'A'を変更するのはあなたの意図ですか? – bencray

+0

ブーリアンオーバーレイマスク(-ing - )に似たアイデアを使うのはどうですか? - {vector | ** 'A' **の一時的にノックアウトされたゾーンの値を隠すのに役立ちます。 – user3666197

+0

@bencray値を取得するだけです。次に行を見るときは、行全体が必要になります。したがって、たとえば、3番目のエントリの有無にかかわらずノルムを比較します。 –

答えて

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で追加されました。

関連する問題