2016-04-12 28 views
1

与えられた(長方形の)隣接行列mq言語で隣接リストを構成する方法は?[kdb +/q]:隣接リストを隣接リストに変換する

私は k)コマンドで qコンソールから実行したときに私に 'vsエラーを与える k言語で解決策を見つけた QIdioms wiki

m:(1 0 1;1 0 1) 
k) (^m)_vs &,/m 
'vs 

結果は次のようになります。

0 0 1 1 
0 2 0 2 

これは何ですか私はqで複製できました:

そう私はちょうど

kさん^shape別名動詞はqに欠落しています。

k) (^m) 
000b 
000b 
q) 2 3#0b 
000b 
000b 

を今、以来:

q) (2 3#0b) _vs where raze m 
' 
q) (2 3#0b) _\: where raze m 
'type 

q) parse "vs" 
k) {x\:y} 

私は失敗したの両方を試してみましたQIdioms wikiには01があることに注意してください逆問題のための:adj.listからadj.matrixへ。

答えて

5

オリジナルのQイディオムがk2で書かれているので、エラーが発生しました。これは、現代のkdb +バージョンがサポートしていない古いバージョンのkです。 kの現在のバージョンはk4で、k2との下位互換性はありません。例えば

、X及びYは、3.4トン2015年12月13日から開始してKDB +でX vs Y意志振る舞うように振る舞っ古いK2の整数の原子またはリストであるX _vs Yhttp://code.kx.com/q/ref/lists/#vs

Since 3.4t 2015.12.13: For integer types, computes the base representation of Y in the radices X.

他の例を示します。実際、k2の^は形状演算子でしたが、それはもはやありません。 k2の^mは、あなたの例ではmの行列に対して2 3を返していましたが、現在の実装はqnot nullのように振る舞います。

元の質問に戻ります。「q言語で隣接リストを作成する方法」を参照してください。しくみはこうだ:

q)lm:{flip raze(til count x),''where each x} 

または

k)lm:{+,/(!#x),''&:'x} 

UPDATE:それを行うための1つの方法はこれです。 countは、要素の数を返しますので、til count Mに「翻訳」することができ、Q (1)のような配列言語では

for i = 0 to <number of rows> - 1   <---- (1) 
    for j = 0 to <number of columns> - 1  <---- (2) 
     if M[i;j] <> 0      <---- (3) 
      print i, j 

:私たちはどんな「冗長」の言語を使用して隣接リストを構築した場合、私たちはこのような何かをするだろうトップレベル、すなわち行の数。(2)(3)は、where each Mで表すことができます。実際、すべての行について、ゼロ以外の要素の位置を返します。元の行列mを与えると、次のようになります。

til count m -> 0 1 
where each m -> (0 2; 0 2) 

行と列のインデックスを結合するだけです。 ,'を使用することはできません。0に最初の0 2とを追加し、2番目に0 2となるため、(0 0 2; 1 0 2)となります。 1つ上のレベルに進む必要があります。左からすべての要素を、ネストされたリスト(0 2; 0 2)の各要素のすべての要素と右から結合します。したがって、ダブルアポストロフィは,''になります。

今は意味があると思います。

0 0 1 1 
0 2 0 2 

を、私は、これははるかに読みやすいと思う::


個人的に、私は、私はこのフォームで隣接行列を読み取ることができません(Kまたは+flipを使用していないだろう

0 0 
0 2 
1 0 
1 2 

もちろん、それはあなた次第です。

+0

イゴール多くのおかげで、それは役立ちます!教育的な理由から、1行qソリューションに含まれるステップを少し分解してコメントしてもらえますか?特に '、 '' puzzles me –

+1

もちろん、私は自分の答えを更新しました。 –

+0

1行1列の特別な場合の隣接行列( 'm:enlist 1')では' lm'関数は 'type'エラーを生成します:' {raze(til count x)、 '' each x} [enlist 1]。 –

関連する問題