转换图。从一种类型的矩阵到另一种(以前的答案不正确)
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 中很典型)并以相同的方式返回关联矩阵。它不会进行错误检查以确保您提供的实际上是一个邻接矩阵(其中每个值都是0
或1
,主对角线都是0
s 并且它关于主对角线对称。)不难添加,
它使用range
辅助函数,它返回一个介于低值(包括)和高值(不包括)之间的整数数组。例如,range (3, 12)
返回[3, 4, 5, 6, 7, 8, 9, 10, 11]
。它使用了一个transpose
辅助函数,该函数在其主对角线上翻转矩阵,将行切换为列,反之亦然。
主函数在矩阵的下对角线上进行双循环。对于每个具有1
的坐标对,我们在该坐标对的每个索引处创建除1
之外的一行0
s,表示图中的一条边。完成后,我们转置矩阵,使我们的边变成列。
看起来像这样:
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
)
)
【讨论】:
以上是关于转换图。从一种类型的矩阵到另一种(以前的答案不正确)的主要内容,如果未能解决你的问题,请参考以下文章
如何使用dto和C#窗口形式将信息从一种形式传输到另一种形式?