Saltar al contenido

¿Cómo trazar un gráfico a partir de su matriz de incidencia?

Posteriormente a observar en diferentes repositorios y páginas de internet al final hemos dado con la solución que te mostraremos pronto.

Las matrices de prueba son matrices pero no matrices de incidencia. Las filas representan los vértices y cada columna representa un borde. En consecuencia, cada columna debe tener solo 2 entradas distintas de cero o una sola entrada de 2 para los bucles automáticos. Este no es el caso de ninguna de las matrices o sus transposiciones.

Para comprobarlo usted mismo, inténtelo, por ejemplo:

mat = IncidenceMatrix[CompleteGraph[4]] // Normal
IncidenceGraph[mat]

La matriz de incidencia:

1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1,
   0, 1, 1

Para ver el uso de la matriz MatrixForm sobre mat.

Usar IncidenceGraph no utilice MatrixForm.

Para gráficos dirigidos, el vértice inicial tiene una entrada -1 y el vértice terminal 1. También puede reproducir esto.

Es útil observar el concepto relacionado de AdjacencyMatrix (que es necesariamente cuadrado) y simétrico para gráficos no dirigidos.

ACTUALIZAR

Como se ha observado en cada respuesta, las matrices proporcionadas no son matrices de incidencia basadas en documentación estándar y documentación de Mathematica. Sin embargo, con base en algunos de los comentarios, presento lo siguiente como, quizás, el gráfico que se relaciona con esta representación.

Las matrices de prueba:

a = 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0,
     0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 
    1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0,
     1, 0, 0, 1;
ma = 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 
    0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0,
     0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 
    1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 
    0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1,
     0, 0, 0, 1, 0;

El gráfico (quizás) deseado:

func[mt_] := Module[s,
  s = SparseArray[mt]["NonzeroPositions"];
  Join @@ (UndirectedEdge @@@ Partition[[email protected][#], 2, 1] & /@
      GatherBy[s, Last])]

Aplicando:

g1 = Graph[func[a], VertexSize -> 0.4, 
  VertexLabels -> Placed["Name", Center], VertexLabelStyle -> 20]
g2 = Graph[func[ma], VertexSize -> 0.4, 
  VertexLabels -> Placed["Name", Center], VertexLabelStyle -> 20]
vis = GraphicsGrid[MatrixForm /@ a, ma, Style["[DownArrow]", 46],
     Style["[DownArrow]", 46], g1, g2, Frame -> True, 
  ImageSize -> 600]

ingrese la descripción de la imagen aquí

y las matrices de incidencia:

in = Grid[MatrixForm /@ a, ma, Style["[DownArrow]", 46], 
    Style["[DownArrow]", 46], 
   MatrixForm[[email protected]
[#]] & /@ g1, g2, Frame -> True]

ingrese la descripción de la imagen aquí

Por supuesto, puedo haber entendido mal la relación entre la matriz y el gráfico deseado.

El termino matriz de incidencia ha causado confusión en este sitio antes, así que creo que es hora de aclarar esto.

No existe una definición estándar, generalmente acordada de matriz de incidencia. Es un término vago para una matriz que describe la relación (conexiones) entre dos clases diferentes de objetos. Lo que son estos objetos puede variar.

Cuando veas el término matriz de incidencia en un contexto nuevo, siempre tómese un momento para buscar la definición precisa.

  • En Mathematica, IncidenceMatrix y IncidenceGraph lidiar con las relaciones entre vértices y bordes de un gráfico, por lo que no puede utilizar IncidenceGraph con tu matriz.

  • A menudo, la matriz de incidencia se refiere a la matriz de adyacencia de un gráfico bipartito de algún tipo.

  • En el libro que cita, la matriz de incidencia describe qué vértice es parte de qué bloque. Esto es diferente de la definición de Mathematica.

Si describe brevemente qué es BIBD y cómo se construyen estos gráficos con precisión, le daré una función para reconstruir el gráfico a partir del tipo de matriz de incidencia que tiene.


Actualizar:

Todavía no tengo muy claro qué está tratando de hacer, así que seguiré adelante con algunas conjeturas. Tu dices,

$ X $ es un conjunto de vértices y $ mathcal A $ es un conjunto de bloques. Un bloque es un conjunto de vértices.

Asumiré que esta matriz de incidencia describe un gráfico bipartito de bloques y vértices, es decir, nos dice qué vértice es miembro de qué bloque. Entonces asumiré que dos vértices están conectados si son miembros del mismo bloque.

Con IGraph / M, podemos hacer esto para obtener el gráfico bipartito:

bg = [email protected]1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1,
     0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 
    1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0,
     1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1

ingrese la descripción de la imagen aquí

Luego, proyéctelo para obtener las relaciones bloque-bloque y vértice-vértice:

IGBipartiteProjections[bg]

ingrese la descripción de la imagen aquí

Sin IGraph / M, podríamos hacer, por ejemplo, esto:

imat = 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0,
     0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 
    0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0,
     0, 1, 0, 0, 1;

am = Unitize[Transpose[imat].imat];

AdjacencyGraph[
 am - [email protected][am] (* get rid of diagonal *)
]

ingrese la descripción de la imagen aquí

Lo sentimos, pero sus matrices no son matrices de incidencia válidas. Desde el IncidenceMatrix página de ayuda:

Para un gráfico no dirigido, una entrada $ a_ ij $ de la matriz de incidencia viene dada por:

  • 0 si el vértice $ v_i $ no es incidente al borde $ e_j $

  • 1 si el vértice $ v_i $ es incidente al borde $ e_j $

  • 2 si el vértice $ v_i $ es incidente al borde $ e_j $ y un bucle automático

En particular, esto significa que todas las columnas en una matriz de incidencia deben sumar 2, ya que los bordes, por definición, conectan dos vértices (excluyendo los bucles, que sus matrices no tienen). Tus matrices fallan esa prueba:

Total[
  1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0,
  1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0,
  1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1,
  0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0,
  0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0,
  0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1
]
3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2

Nos encantaría que puedieras dar visibilidad a este tutorial si te fue de ayuda.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags :

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *