转换图。从一种类型的矩阵到另一种(以前的答案不正确)

Posted

技术标签:

【中文标题】转换图。从一种类型的矩阵到另一种(以前的答案不正确)【英文标题】:converting graph. from one type of matrix to another (previous answer is incorrect) 【发布时间】:2022-01-01 05:13:07 【问题描述】:

一个简单的无向图由邻接矩阵给出

一个简单的无向图由邻接矩阵定义。需要推导关联矩阵

输入:

3

0 1 0

1 0 1

0 1 0

输出:

1 0

1 1

0 1

输入:

5

0 0 1 1 0

0 0 1 0 0

1 1 0 0 1

1 0 0 0 1

0 0 1 1 0

输出:

1 0 1 0 0

0 1 0 0 0

1 1 0 1 0

0 0 1 0 1

0 0 0 1 1

    const convert = () => 
    let arr = [
        [0,0,1,1,0],
        [0,0,1,0,0],
        [1,1,0,0,1],
        [1,0,0,0,1],
        [0,0,1,1,0]
    ]
    let matrix = []
    let subArray = []
    for (let i = 0; i < arr.length; i++) 
        for (let j = 0; j < arr.length; j++) 
            subArray.push(0)
        
        matrix.push(subArray)
        subArray = []
    
    for (let i = 0; i < arr.length; i++) 
        for (let j = 0; j < arr.length; j++) 
            if(arr[j][i] == 1)
                subArray.push(j)
                
            
        
        console.log(subArray)
        subArray = []
    
    console.log(matrix)

convert()

如何正确实现从一种矩阵到另一种矩阵的转换?

【问题讨论】:

重新打开,因为这个问题是在询问 ***.com/q/70060588 的反面,这是另一个方向的转换。 【参考方案1】:

这不会尝试进行任何输入解析,但它确实接受邻接矩阵(作为数组的数组,这在 JS 中很典型)并以相同的方式返回关联矩阵。它不会进行错误检查以确保您提供的实际上是一个邻接矩阵(其中每个值都是01,主对角线都是0s 并且它关于主对角线对称。)不难添加,

它使用range 辅助函数,它返回一个介于低值(包括)和高值(不包括)之间的整数数组。例如,range (3, 12) 返回[3, 4, 5, 6, 7, 8, 9, 10, 11]。它使用了一个transpose 辅助函数,该函数在其主对角线上翻转矩阵,将行切换为列,反之亦然。

主函数在矩阵的下对角线上进行双循环。对于每个具有1 的坐标对,我们在该坐标对的每个索引处创建除1 之外的一行0s,表示图中的一条边。完成后,我们转置矩阵,使我们的边变成列。

看起来像这样:

const range = (lo, hi) => 
  Array.from (length: hi - lo, (_, i) => i + lo)

const transpose = (xs) => 
  xs [0] .map ((_, i) => xs .map (r => r[i]))

const adj2inci = (m) => 
  transpose (range (0, m .length) 
    .flatMap (j => range (0, j + 1) .flatMap (
      i => m[j][i] == 1 ? [Object .assign (Array (m .length) .fill (0), [i]: 1, [j]: 1)] : [])
    )
  )

const incidents = [[0, 0, 1, 1, 0], [0, 0, 1, 0, 0], [1, 1, 0, 0, 1], [1, 0, 0, 0, 1], [0, 0, 1, 1, 0]]

console .log (adj2inci (incidents))
.as-console-wrapper max-height: 100% !important; top: 0

请注意,虽然图有一个确定的邻接矩阵,但关联矩阵有多种表示形式,因为列的重新排列仍将表示同一个图。

这意味着如果我们从一个邻接矩阵开始,对它运行adj2inci,然后对结果运行inci2adj from a related answer1,我们将得到相同的矩阵我们从。但是如果我们从关联矩阵开始,对它运行inci2adj,然后在结果上运行adj2inci,我们不一定会得到原始矩阵。


1代码如下:

const inci2adj = (m) => 
  range (0, m .length) .map (
    j => range (0, m .length) .map (i => m [0] .some (
      (_, e) => i !== j &&  m [i] [e] == 1 && m [j] [e] == 1) ? 1 : 0
    )
  )

【讨论】:

以上是关于转换图。从一种类型的矩阵到另一种(以前的答案不正确)的主要内容,如果未能解决你的问题,请参考以下文章

向量从一种类型到另一种c ++的隐式转换

关于将输入数组从一种形状广播到另一种形状的正确方法

如何使用dto和C#窗口形式将信息从一种形式传输到另一种形式?

您如何链接承诺但将类型从一种更改为另一种?

Altova DatabaseSpy:将整个数据库结构从一种数据库类型迁移到另一种数据库类型

通过重新解释原始字节从一种类型的 numpy 数组转换为另一种类型