Rank es una generalización del bucle como se usa en lenguajes de programación escalares (no orientados a arreglos ) . [1] [2] También es una generalización de mapcar en el lenguaje Lisp [3] y map en lenguajes de programación funcional modernos , y una generalización de extensión escalar, producto interno ( matriz ) y producto externo en APL \ 360. La implementación canónica del rango puede ser el lenguaje J , pero también está disponible en Dyalog APL , la Organización Internacional de Normalización (ISO).estándar técnico en Extended APL y NARS2000.
El rango tiene varios significados diferentes. En general, el concepto de rango se usa para tratar un arreglo ortogonal en términos de sus subarreglos. [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 al nivel de su átomos individuales.
Clasificar como una generalización del bucle
Comprender el rango requiere 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 indica con una barra inclinada /
. En J, la barra oblicua toma un argumento a la izquierda de la función y un argumento a la derecha de la matriz que será reducida por esa función.
+ / 1 2 3 6
El resultado es 1 + 2 + 3
, como se esperaba.
También se puede crear i.
una matriz de números enteros N-dimensional con la que toma un vector de números enteros como argumentos. El número de enteros define la dimensión y el valor absoluto de cada 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 1112 13 14 15 16 17 18 19 20 21 22 23
Ahora reduzcamos una matriz bidimensional por suma.
+ / i . 2 3 3 5 7
El resultado es 0 1 2 + 3 4 5
, como se esperaba. La reducción corre por cada columna, sumando todos los números en esa columna.
Esta aplicación de +/
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 hacer esto en J sin bucles simplemente usando rank.
+ / " 1 i . 2 3 3 12
Para ilustrar mejor cómo funciona el rango en J, podemos ver que la expresión original es el rango 2. El operador se asigna en el rango más alto a la matriz.
+ / " 2 i . 2 3 3 5 7
Es común referirse a las matrices de dimensiones inferiores con estos nombres, [6] aunque a veces se disputan. [7]
Nombre Rango Átomo o escalar 0 Vector o lista 1 Tabla o matriz 2 Tensor o cubo 3
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 del verbo
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 los sustantivos con rangos superiores a 0. Este rango de verbo se expresa en tres números:
- Rango para el caso de la mónada; por ejemplo,
−y
utiliza−
como mónada - Rango para el argumento de la izquierda para el caso de la díada; por ejemplo,
x−y
utiliza−
como díada - Rango para el argumento correcto para el caso de la díada
En todos los casos, existe alguna definición de verbo subyacente que se aplica a las celdas , que son subarreglos del rango indicado. O, si el argumento no tiene tantas dimensiones, el argumento completo.
En los verbos, el rango negativo se interpreta como el rango del sustantivo proporcionado para ese argumento menos el valor indicado. (Pero nunca menos de cero).
- Por ejemplo, un verbo con rango monádico de uno negativo cuando se le da un argumento de rango 3, divide el argumento en una lista de matrices de rango 2. El cuerpo del verbo se aplica una vez a cada uno de estos subarreglos 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 de prefijo, llamada marco , y la secuencia de dimensiones de sufijo, llamadas celdas . Los rangos de verbos positivos indican el número de dimensiones de la celda, los rangos de verbos negativos indican el número de dimensiones del marco.
En el caso diádico, hay dos marcos: uno para el argumento de la izquierda y otro para el argumento de la derecha. Estos marcos deben coincidir. Si los marcos no son idénticos, uno debe ser un prefijo del otro; por ejemplo, (i. 2 3) *"0 1 i. 2 3 4
multiplica cada escalar (elemento de dimensión cero) a la izquierda por cada vector (elemento unidimensional) a 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 las celdas relevantes. En casos degenerados, donde los argumentos no tienen dimensiones suficientes, el rango del verbo se reduce efectivamente (lo que influiría en su resultado).
Por ejemplo,
10 + 4 5 6 14 15 16
Aquí, el verbo +
tiene un rango de 0 0 0, el argumento de la izquierda tiene un rango de 0 y el argumento de la derecha tiene un rango de 1 (con una dimensión de 3). Por lo tanto, el argumento de la izquierda tiene un marco de rango 0 y el argumento de la derecha tiene un marco de rango 1 (con una dimensión 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 a la izquierda del verbo y un argumento a la derecha del sustantivo para crear un nuevo verbo. El argumento del sustantivo derecho consta de hasta tres números que especifican el rango monádico, el rango diádico izquierdo y el rango diádico derecho, respectivamente. [8]
Si el argumento de la derecha tiene solo dos números, se toman como los 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. Entonces, si queremos agregar un vector a cada vector en una matriz:
1 2 3 + "1 1 i. 3 31 3 54 6 87 9 11
Si en cambio queremos agregar cada escalar de la izquierda a cada vector de la derecha, lo haríamos de esta manera:
1 2 3 + "0 1 i. 3 31 2 35 6 79 10 11
Si el argumento correcto es solo un número, se toma como rango para los tres casos.
Si el argumento correcto es un verbo, se usa su rango. Por ejemplo, todos derivan el mismo verbo:
* + "0 0 0* + "0 0* + "0* + "+
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 cualquier argumento y siempre produce un resultado que es ese sustantivo.
Referencias
- ^ Slepak, Justin; Escalofríos, Olin; Manolios, Panagiotis. "Un lenguaje orientado a matrices con polimorfismo de rango estático" (PDF) .
- ^ "Código sin bucle I: los verbos tienen rango" . Jsoftware .
- ^ "La función mapcar" . Fundación de Software Libre .
- ^ Bernecky, R. (diciembre de 1987). "Una introducción al rango de funciones" . Actas de la conferencia APL88, APL Quote Quad . 18 .
- ^ "Control de la ejecución del verbo especificando un rango" . Jsoftware .
- ^ Rabanser, Stephan; Shchur, Oleksandr; Günnemann, Stephan (29 de noviembre de 2017). "Introducción a las descomposiciones de tensor y sus aplicaciones en el aprendizaje automático". arXiv : 1711.10781 [ stat.ML ].
- ^ kgwgk; nabla9; azag0; a mi; radarsat1 (24 de abril de 2017). "HPTT: una transposición de tensor de alto rendimiento C ++" . Noticias de hackers . Y Combinator . Consultado el 10 de diciembre de 2019 .
- ^ Burke, Chris (12 de septiembre de 2014). "Ensayos: Rango" . Jsoftware .
Abrams, PS (febrero de 1970). "§II.E". Una máquina APL (PDF) . Universidad de Stanford (PhD).
Backus, JW, ¿Puede la programación liberarse del estilo von Neumann? Un estilo funcional y su álgebra de programas ( https://www.thocp.net/biographies/papers/backus_turingaward_lecture.pdf ), Comunicaciones del ACM, Volumen 21, Número 8, 1978-08 .; §11.3.3.
Bernecky, R., An Introduction to Function Rank ( https://dl.acm.org/citation.cfm?id=55632 ), Actas de la conferencia APL88, APL Quote Quad, Volumen 18, Número 2, 1987-12.
Bernecky, R .; Iverson, KE (6 a 8 de octubre de 1980). "Operadores y matrices cerradas" . Actas . Reunión de usuarios de APL de 1980. Jsoftware .
Bernecky, R .; Iverson, KE; McDonnell, EE; Metzger, RC; Schueler, JH (2 de mayo de 1983). "SATN 45: Extensiones de idioma de mayo de 1983" . Jsoftware . IP Sharp Associates Limited.
Brown, JA, The Principles of APL2 ( http://www.softwarepreservation.org/projects/apl/Papers/PRINCIPLESOFAPL2 ), TR 03.247, Laboratorio IBM Santa Teresa, San José, California, 1984-03; §20.0.
Notas de lanzamiento de Dyalog, Dyalog APL versión 14.0 ( http://www.dyalog.com/dyalog-version-140.htm ), Dyalog Limited, 2015.
Hui, RKW, Rank and Uniformity ( http://www.jsoftware.com/papers/rank.htm ), Actas de la conferencia APL95, APL Quote Quad, Volumen 25, Número 4, 1995-06.
Hui, RKW, Recordando a Ken Iverson ( https://keiapl.org/rhui/remember.htm ), 2004-11.
Hui, RKW, Inner Product — An Old / New Problem ( http://www.jsoftware.com/papers/innerproduct/ip.htm ), Conferencia de la Asociación Británica de APL 2009, 2009-06-08.
Iverson, KE, Operators and Functions ( http://www.jsoftware.com/papers/opfns.htm ), Informe de investigación # RC7091, IBM, 1978-04-26.
Iverson, KE, Diccionario de APL ( http://www.jsoftware.com/papers/APLDictionary.htm ), APL Quote Quad, Volumen 18, Número 1, 1987-09.
Iverson, KE, A Personal View of APL ( http://www.jsoftware.com/papers/APLPersonalView1.htm ), IBM Systems Journal, Volumen 30, Número 4, 1991-12.
Slepak, Justin; Escalofríos, Olin; Manolios, Panagiotis, un lenguaje orientado a matrices con polimorfismo de rango estático ( http://www.ccs.neu.edu/home/jrslepak/typed-j.pdf ).
enlaces externos
- J Entrada de diccionario para "rango"
- Clasificación en "Aprendizaje J"