stringtranslate.com

Rango (lenguaje de programación J)

Rank es una generalización del bucle tal como se utiliza en los lenguajes de programación escalares (no orientados a matrices ) . [1] [2] También es una generalización de mapcar en el lenguaje Lisp [3] y map en los lenguajes de programación funcional modernos , y una generalización de la extensión escalar, el producto interno ( matriz ) y el producto externo en APL\360. La implementación canónica de rank puede ser el lenguaje J , pero también está disponible en Dyalog APL , el estándar técnico de la Organización Internacional de Normalización (ISO) sobre APL extendido y NARS2000.

El rango tiene varios significados diferentes. En general, el concepto de rango se utiliza para tratar una matriz ortogonal en términos de sus submatrices. [4] Por ejemplo, una matriz bidimensional puede tratarse en el rango 2 como la matriz completa, o en el rango 1 para trabajar con sus columnas o filas unidimensionales implícitas, o en el rango 0 para trabajar a nivel de sus átomos individuales.

El rango como generalización del bucle

Para comprender el rango es necesario conocer algunos conceptos básicos de programación orientada a matrices. En la mayoría de los lenguajes basados ​​en matrices, la reducción se denota con una barra / diagonal . En J, la barra diagonal toma un argumento izquierdo de la función y un argumento derecho de la matriz que se va a reducir mediante esa función.

 +/ 1 2 36

El resultado es 1 + 2 + 3el esperado.

También se puede crear una matriz de números enteros de N dimensiones i.que tome como argumento un vector de números enteros. La cantidad de números enteros define la dimensión y el valor absoluto de cada número entero define la longitud de la dimensión correspondiente.

 yo . 3 0 1 2    yo . 2 3 0 1 2 3 4 5       yo . 2 3 4 0 1 2 3 4 5 6 7 8 9 10 11               12 13 14 15 16 17 18 19 20 21 22 23         

Ahora vamos a reducir una matriz bidimensional mediante la adición.

 +/ yo . 2 3 3 5 7     

El resultado es 0 1 2 + 3 4 5, como se esperaba. La reducción se ejecuta hacia abajo en cada columna, sumando todos los números de esa columna.

Esta aplicación de +/a una matriz bidimensional corresponde al fragmento de código C: [5]

para ( j = 0 ; j < 3 ; ++ j ) { suma [ j ] = 0 ; } para ( i = 0 ; i < 2 ; ++ i ) { para ( j = 0 ; j < 3 ; ++ j ) { suma [ j ] += matriz [ i ][ j ]; } }                             

Supongamos que quisiéramos sumar los elementos de cada fila, como en el fragmento de código C:

para ( i = 0 ; i < 2 ; ++ i ) { suma [ i ] = 0 ; para ( j = 0 ; j < 3 ; ++ j ) { suma [ i ] += matriz [ i ][ j ]; } }                      

Para producir el resultado 3 12, podemos hacerlo en J sin bucles, simplemente usando rank.

 +/" 1 yo . 2 3 3 12    

Para ilustrar mejor cómo funciona el rango en J, podemos ver que la expresión original es rango 2. El operador se asigna al rango más alto de la matriz.

 +/" 2 yo . 2 3 3 5 7     

Es común referirse a las matrices de menor dimensión con estos nombres, [6] aunque a veces son motivo de controversia. [7]

Rango del sustantivo

Los sustantivos, en J, son matrices . El rango de un sustantivo es el número de dimensiones de esa matriz. El verbo derivado #@$determina el rango de un sustantivo.

Rango verbal

Los verbos, en J, son funciones que toman argumentos sustantivos y producen resultados sustantivos. El rango de un verbo controla cómo se aplica el verbo a sustantivos con rangos mayores que 0. Este rango verbal se expresa con tres números:

  1. Rango para el caso de mónada; por ejemplo, −yse utiliza como mónada
  2. Rango para el argumento de la izquierda para el caso de díada; por ejemplo, x−yse utiliza como díada
  3. Clasifique el argumento correcto para el caso de la díada

En todos los casos, hay una definición verbal subyacente que se aplica a las celdas , que son submatrices del rango indicado. O, si el argumento no tiene tantas dimensiones, al argumento completo.

En los verbos, el rango negativo se interpreta como el rango del sustantivo suministrado para ese argumento menos el valor indicado. (Pero nunca menos que cero).

Por ejemplo, un verbo con rango monádico negativo uno, cuando recibe un argumento de rango 3, descompone el argumento en una lista de matrices de rango 2. El cuerpo del verbo se aplica una vez a cada una de estas submatrices bidimensionales.

En el contexto de un verbo específico y un sustantivo específico, las dimensiones de ese sustantivo se dividen en la secuencia de dimensiones del prefijo, llamada marco , y la secuencia de dimensiones del sufijo, llamada celdas . Los rangos verbales positivos indican el número de dimensiones de celdas, los rangos verbales negativos indican el número de dimensiones del marco.

En el caso diádico, hay dos marcos: uno para el argumento izquierdo y otro para el argumento derecho. Estos marcos deben coincidir. Si los marcos no son idénticos, uno debe ser un prefijo del otro; por ejemplo, multiplica cada escalar (elemento de dimensión cero) de la izquierda por cada vector (elemento de dimensión unidimensional) de la derecha. El resultado de evaluar este verbo tendrá las dimensiones del marco más largo como las dimensiones del prefijo de su resultado. Las dimensiones del resultado final, si las hubiera, serían el resultado del verbo aplicado a la(s) celda(s) relevante(s). En casos degenerados, donde los argumentos no tienen dimensiones suficientes, el rango del verbo se reduce efectivamente (lo que influiría en su resultado).(i. 2 3) *"0 1 i. 2 3 4

Por ejemplo,

 10 + 4 5 6 14 15 16       

Aquí, el verbo +tiene un rango de 0 0 0, el argumento izquierdo tiene un rango de 0 y el argumento derecho tiene un rango de 1 (con una dimensión de 3). Por lo tanto, el argumento izquierdo tiene un marco de rango 0 y el argumento derecho tiene un marco de rango 1 (con una dimensión de 3). El marco (vacío) del argumento izquierdo es un sufijo válido para el marco del argumento derecho, por lo que esta es una operación válida. El resultado tiene un rango de 1 y una dimensión de 3.

La conjunción de rango

La conjunción de rango toma un argumento izquierdo del verbo y un argumento derecho del sustantivo para crear un nuevo verbo. El argumento derecho del sustantivo consta de hasta tres números que especifican el rango monádico, el rango izquierdo diádico y el rango derecho diádico, respectivamente. [8]

Si el argumento de la derecha son solo dos números, se toman como rangos para el caso diádico: el primer número es el rango del argumento de la izquierda y el segundo número es el rango del argumento de la derecha. Por lo tanto, si queremos agregar un vector a cada vector de una matriz:

 1 2 3 +" 1 1 yo . 3 3 1 3 5 4 6 8 7 9 11             

Si en cambio quisiéramos sumar cada escalar de la izquierda a cada vector de la derecha lo haríamos de esta manera:

 1 2 3 +" 0 1 yo . 3 3 1 2 3 5 6 7 9 10 11             

Si el argumento correcto es sólo un número, se toma como rango para los tres casos.

Si el argumento correcto es un verbo, se utiliza su rango. Por ejemplo, todos estos derivan del mismo verbo:

Si el argumento izquierdo de la conjunción de rango es un sustantivo, se crea un verbo constante. El cuerpo de este verbo ignora los valores de los argumentos y siempre produce un resultado que es ese sustantivo.

Referencias

  1. ^ Slepak, Justin; Shivers, Olin; Manolios, Panagiotis. "Un lenguaje orientado a matrices con polimorfismo de rango estático" (PDF) .
  2. ^ "Código sin bucles I: los verbos tienen rango". Jsoftware .
  3. ^ "La función mapcar". Fundación para el Software Libre .
  4. ^ Bernecky, R. (diciembre de 1987). "Introducción al rango de funciones". Actas de la conferencia APL88, APL Quote Quad . Vol. 18.
  5. ^ "Control de la ejecución de verbos mediante la especificación de un rango". Jsoftware .
  6. ^ Rabanser, Stephan; Shchur, Oleksandr; Günnemann, Stephan (29 de noviembre de 2017). "Introducción a las descomposiciones tensoriales y sus aplicaciones en el aprendizaje automático". arXiv : 1711.10781 [stat.ML].
  7. ^ kgwgk; nabla9; azag0; tomo; radarsat1 (24 de abril de 2017). «HPTT: una transposición de tensor de alto rendimiento en C++». Hacker News . Y Combinator . Consultado el 10 de diciembre de 2019 .{{cite web}}: CS1 maint: nombres numéricos: lista de autores ( enlace )
  8. ^ Burke, Chris (12 de septiembre de 2014). "Ensayos: Ranking". Jsoftware .

Enlaces externos