元の Q イディオムが k2 (最新の kdb+ バージョンではサポートされていない k の古いバージョン) で記述されているため、エラーが発生しました。k の現在のバージョンは k4 であり、k2 との下位互換性はありません。
たとえば、X _vs Y
X と 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 3
m
q
not 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 M
count
(2)
(3)
where each M
til count m -> 0 1
where each m -> (0 2; 0 2)
行インデックスと列インデックスを結合するだけです。1番目と2 番目,'
が結合して になるという理由だけで使用することはできません。左からのすべての要素を、右からのネストされたリストのすべての要素のすべての要素と結合して、1 レベル深くする必要があります。0
0 2
1
0 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
しかし、それはもちろんあなた次第です。