【问题标题】:[kdb+/q]: Convert adjacency matrix to adjacency list[kdb+/q]:将邻接矩阵转换为邻接表
【发布时间】:2016-04-12 10:54:00
【问题描述】:

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

QIdioms wiki 中,我在k 语言中找到了解决方案,当使用k) 命令通过q 控制台运行时会出现'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's^ a.k.a. 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 wikiq solution 用于逆问题:从 adj.list 到 adj.matrix。

【问题讨论】:

    标签: kdb q-lang k


    【解决方案1】:

    您遇到了错误,因为原始 Q 习语是用 k2 编写的——现代 kdb+ 版本不支持的 k 的旧版本。 k 的当前版本是 k4,它不向后兼容 k2。

    例如,X _vs Y 其中 X 和 Y 是整数原子或旧 k2 中的列表的行为类似于 X vs Y 从 3.4t 2015.12.13 开始在 kdb+ 中的行为:http://code.kx.com/q/ref/lists/#vs:

    自 3.4t 2015.12.13 起:对于整数类型,计算基数 X 中 Y 的基本表示。

    另一个例子。事实上,k2 中的^ 是一个形状运算符,但它不再是。在 k2 中,^m 会从您的示例中返回 2 3 矩阵 m,而据我所知,当前实现的行为类似于 qnot null

    现在,回到你原来的问题,“如何用q 语言构建邻接列表”。一种方法是:

    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 这样的数组语言中,(1) 可以“翻译”成til count M,因为count 将返回顶层元素的数量,即行数。 (2)(3) 组合可以用where each M 表示。实际上,对于每一行,我们都会返回非零元素的位置。给定一个原始矩阵 m,我们将得到:

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

    我们需要做的就是连接行和列索引。我们不能只使用,',因为它会将0 与第一个0 21 与第二个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
    

    当然,这取决于你。

    【讨论】:

    • 伊戈尔非常感谢,这很有帮助!出于教学原因,您是否介意分解并评论一下单行 q 解决方案中涉及的步骤?尤其是,''让我困惑
    • 对于1行1列的特殊情况邻接矩阵(m: enlist 1),lm函数产生type错误:{raze(til count x),''where each x} [enlist 1]
    • @DanielKrizian:1 行 1 列的特殊情况邻接矩阵是enlist enlist 1lm 产生正确答案0 0enlist 1 不是矩阵,是向量;这就是您收到 'type 错误的原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-19
    • 1970-01-01
    相关资源
    最近更新 更多