1

(長方形の)隣接行列が与えられた場合、言語mで隣接リストを作成する方法は?q

QIdioms wikiで、コマンドを使用してコンソールを実行するとエラーが発生kする言語で解決策を見つけました。qk)'vs

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

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

0 0 1 1
0 2 0 2

これは私が複製できたものですq

k) &,/m
0 2 3 5
q) where raze m
0 2 3 5

k^別名shape動詞が欠落してqいるので、私はちょうどやった:

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

今、以来:

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

私は両方を試してみましたが失敗しました:

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

QIdioms wikiには、逆問題のq 解決策があることに注意してください: adj.list から adj.matrix へ。

4

1 に答える 1

5

元の Q イディオムが k2 (最新の kdb+ バージョンではサポートされていない k の古いバージョン) で記述されているため、エラーが発生しました。k の現在のバージョンは k4 であり、k2 との下位互換性はありません。

たとえば、X _vs YX と Y が整数のアトムまたはリストである場合、古い k2 の動作は、3.4t 2015.12.13 以降の kdb+ では次のようX vs Y に動作します: http://code.kx.com/q/ref/lists/#vs :

3.4t 2015.12.13 以降: 整数型の場合、基数 X で Y の基本表現を計算します。

もう一つの例。実際^、k2 には形状演算子がありましたが、それはもはやありません。k2 では、あなたの例から行列^mが返されますが、現在の実装は私が理解している限りのように動作します。2 3mqnot null

qさて、元の質問「言語で隣接リストを作成する方法」に戻ります。それを行う1つの方法は次のとおりです。

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

また

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

更新:これがどのように機能するかです。「冗長な」言語を使用して隣接リストを作成する場合は、次のようにします。

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

q のような配列言語では、最上位の要素数、つまり行数を返すため、 q(1)を「変換」することができます。と組み合わせて で表すことができます。実際、すべての行に対して、ゼロ以外の要素の位置を返します。元の行列 m が与えられると、次のようになります。til count Mcount(2)(3)where each M

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

行インデックスと列インデックスを結合するだけです。1番目と2 番目,'が結合して になるという理由だけで使用することはできません。左からのすべての要素を、右からのネストされたリストのすべての要素のすべての要素と結合して、1 レベル深くする必要があります。00 210 2(0 0 2; 1 0 2)(0 2; 0 2),''

今はそれが理にかなっていることを願っています。


個人的にはflip(または+k では) 使用しません。次の形式で隣接行列を読み取ることはできません。

0 0 1 1
0 2 0 2

これははるかに読みやすいと思います:

0 0
0 2
1 0
1 2

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

于 2016-04-12T13:30:47.707 に答える