オリジナルのQイディオムがk2で書かれているので、エラーが発生しました。これは、現代のkdb +バージョンがサポートしていない古いバージョンのkです。 kの現在のバージョンはk4で、k2との下位互換性はありません。例えば
、X及びYは、3.4トン2015年12月13日から開始してKDB +でX vs Y
意志振る舞うように振る舞っ古いK2の整数の原子またはリストであるX _vs Y
:http://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
を返していましたが、現在の実装はq
のnot 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
もちろん、それはあなた次第です。
イゴール多くのおかげで、それは役立ちます!教育的な理由から、1行qソリューションに含まれるステップを少し分解してコメントしてもらえますか?特に '、 '' puzzles me –
もちろん、私は自分の答えを更新しました。 –
1行1列の特別な場合の隣接行列( 'm:enlist 1')では' lm'関数は 'type'エラーを生成します:' {raze(til count x)、 '' each x} [enlist 1]。 –