[kdb+/q]:将邻接矩阵转换为邻接列表

[kdb+/q]:将邻接矩阵转换为邻接列表,kdb,q-lang,k,Kdb,Q Lang,K,给定矩形邻接矩阵m,如何用q语言构造邻接表 在中,我找到了用k语言编写的解决方案,当使用k命令通过q控制台运行时,会给出“vs error”: 结果应该是: 0 0 1 1 0 2 0 2 这就是我能够在q中复制的: q中缺少k的^a.k.a.形动词,所以我做了: k) (^m) 000b 000b q) 2 3#0b 000b 000b 现在,因为: q) parse "vs" k) {x\:y} 我尝试了两种方法都没有成功: q) (2 3#0b) _vs where raze m '

给定矩形邻接矩阵m,如何用q语言构造邻接表

在中,我找到了用k语言编写的解决方案,当使用k命令通过q控制台运行时,会给出“vs error”:

结果应该是:

0 0 1 1
0 2 0 2
这就是我能够在q中复制的:

q中缺少k的^a.k.a.形动词,所以我做了:

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

请注意,对于反问题:从adj.list到adj.matrix,您有一些错误,因为原始的Q习惯用法是用k2编写的,k2是k的旧版本,现代kdb+版本不支持。k的当前版本是k4,它与k2不向后兼容

例如,X_vs Y,其中X和Y是整数原子,或者旧k2中的列表的行为类似于X vs Y,将从2015年12月13日起在kdb+中表现为:

自2015年12月13日3.4t起:对于整数类型,计算半径X中Y的基本表示形式

另一个例子。实际上,k2中的^是一个形状操作符,但它不再是了。在k2中,m将从您的示例中为矩阵m返回23,而据我所知,当前实现的行为类似于q的NOTNULL

现在,回到您最初的问题,如何用q语言构造邻接列表。一种方法是:

q)lm:{flip raze(til count x),''where each 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
我们所需要做的就是连接行和列索引。我们不能使用“just”,因为它会将0与第一个0 2连接起来,将1与第二个0 2连接起来,从而得到0 2;1 0 2. 我们需要更深一层,将左侧的每个元素与嵌套列表02中每个元素的每个元素连接起来;0 2,因此在中使用双撇号

我希望它现在有意义

就我个人而言,我不会在k中使用flip或+,我无法读取以下形式的邻接矩阵:

0 0 1 1
0 2 0 2
我认为这更具可读性:

0 0
0 2
1 0
1 2

但是这当然取决于你。

你会有错误,因为原始的Q习惯用法是用k2编写的,k2是k的旧版本,现代kdb+版本不支持。k的当前版本是k4,它与k2不向后兼容

例如,X_vs Y,其中X和Y是整数原子,或者旧k2中的列表的行为类似于X vs Y,将从2015年12月13日起在kdb+中表现为:

自2015年12月13日3.4t起:对于整数类型,计算半径X中Y的基本表示形式

另一个例子。实际上,k2中的^是一个形状操作符,但它不再是了。在k2中,m将从您的示例中为矩阵m返回23,而据我所知,当前实现的行为类似于q的NOTNULL

现在,回到您最初的问题,如何用q语言构造邻接列表。一种方法是:

q)lm:{flip raze(til count x),''where each 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
我们所需要做的就是连接行和列索引。我们不能使用“just”,因为它会将0与第一个0 2连接起来,将1与第二个0 2连接起来,从而得到0 2;1 0 2. 我们需要更深一层,将左侧的每个元素与嵌套列表02中每个元素的每个元素连接起来;0 2,因此在中使用双撇号

我希望它现在有意义

就我个人而言,我不会在k中使用flip或+,我无法读取以下形式的邻接矩阵:

0 0 1 1
0 2 0 2
我认为这更具可读性:

0 0
0 2
1 0
1 2

但这当然取决于你。

我非常感谢,这很有帮助!出于教学方面的原因,您是否介意对单线q解决方案中涉及的步骤进行分解和评论?特别是,让我困惑的是,对于1行1列的特例邻接矩阵m:enlist 1,lm函数生成类型错误:{razetil count x,其中每个x}[enlist 1]。@DanielKrizian:1行1列的特例邻接矩阵是enlist enlist 1,lm为其生成正确答案0。登记1不是一个矩阵,它是一个向量;这就是你得到“类型错误”的原因。我非常感谢,这很有帮助!出于教学方面的原因,您是否介意对单线q解决方案中涉及的步骤进行分解和评论?特别是,让我困惑的是,对于1行1列的特例邻接矩阵m:enlist 1,lm函数生成类型错误:{razetil count x,其中每个x}[enlist 1]。@DanielKrizian:1行1列的特例邻接矩阵是enlist enlist 1,lm为其生成正确答案0。登记1不是一个矩阵,它是一个向量;这就是为什么会出现“类型错误”。