Saltar al contenido

Permutar asociación key y generar una escasa array

Recuerda que en las ciencias un problema puede tener diversas resoluciones, así que te compartimos lo más óptimo y eficiente.

Solución:

tal vez con SymmetrizedArray?

size = 4;
rank = 4;
Av = <|1, 4, 2, 3 -> a, 2, 4, 2, 4 -> b|>;
symmetries = 
   4, 2, 3, 1, 1,
   4, 3, 2, 1, 1,
   1, 3, 2, 4, 1,
   2, 1, 4, 3, 1,
   3, 1, 4, 2, 1,
   3, 4, 1, 2, 1,
   2, 4, 1, 3, 1
   ;
A = SparseArray[
  SymmetrizedArray[Normal[Av], ConstantArray[n, rank], symmetries]
  ]

En la lista symmetriescada entrada es un par p,s de una permutación p que se puede aplicar y un signo s (1, -1) que nos dice si el array está destinado a ser simétrico (s = 1 significa simétrico, s = -1 significa antisimétrico).

De hecho, basta con proporcionar solo un conjunto de generadores del grupo de simetría. Por ejemplo,

symmetries = 
   4, 2, 3, 1, 1,
   1, 3, 2, 4, 1,
   2, 4, 1, 3, 1
   ;

llevaría al mismo resultado

pg = PermutationGroup[1, 2, 3, 4, 4, 2, 3, 1, 4, 3, 2, 1, 1, 
     3, 2, 4, 2, 1, 4, 3, 3, 1, 4, 2, 3, 4, 1, 2, 2, 4, 1, 3];

ClearAll[sAbuild]
sAbuild = SparseArray[KeyValueMap[Alternatives @@ 
         GroupOrbits[pg, #, Permute][[1]] -> #2 &]@#, #2] &;

dims = 4, 4, 4, 4;

sAbuild[Av, dims]

ingrese la descripción de la imagen aquí

Según la respuesta de Henrik, podemos usar un conjunto más pequeño de generadores para obtener el mismo resultado:

pg = PermutationGroup @ 4, 2, 3, 1, 1, 3, 2, 4, 2, 4, 1, 3;

Comentarios y calificaciones

Si te animas, puedes dejar un escrito acerca de qué le añadirías a esta división.

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



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada.