stringtranslate.com

corte de matriz

En programación de computadoras , la división de matrices es una operación que extrae un subconjunto de elementos de una matriz y los empaqueta como otra matriz, posiblemente en una dimensión diferente a la original.

Ejemplos comunes de corte de matrices son extraer una subcadena de una cadena de caracteres, el " ell " en "h ell o", extraer una fila o columna de una matriz bidimensional o extraer un vector de una matriz .

Dependiendo del lenguaje de programación , una porción de matriz puede estar formada por elementos no consecutivos. También dependiendo del idioma, los elementos de la nueva matriz pueden tener un alias (es decir, compartir memoria con) los de la matriz original.

Detalles

Para matrices "unidimensionales" (de un solo índice) (vectores, secuencias, cadenas, etc.), la operación de corte más común es la extracción de cero o más elementos consecutivos. Por lo tanto, si tenemos un vector que contiene elementos (2, 5, 7, 3, 8, 6, 4, 1) y queremos crear una porción de matriz desde el tercer al sexto elemento, obtenemos (7, 3, 8, 6). En los lenguajes de programación que utilizan un esquema de indexación basado en 0, el segmento sería del índice 2 al 5 .

Reducir el rango de cualquier índice a un solo valor elimina efectivamente ese índice. Esta característica se puede utilizar, por ejemplo, para extraer cortes unidimensionales (vectores: en 3D, filas, columnas y tubos [1] ) o cortes bidimensionales (matrices rectangulares) de una matriz tridimensional. Sin embargo, dado que el rango se puede especificar en tiempo de ejecución, los lenguajes con verificación de tipos pueden requerir una notación explícita (en tiempo de compilación) para eliminar los índices triviales.

La división general de matrices se puede implementar (ya sea integrada o no en el lenguaje) haciendo referencia a cada matriz a través de un vector o descriptor de droga  : un registro que contiene la dirección del primer elemento de la matriz, y luego el rango de cada índice y el coeficiente correspondiente en la fórmula de indexación. Esta técnica también permite la transposición inmediata de matrices , la inversión de índices, el submuestreo, etc. Para lenguajes como C , donde los índices siempre comienzan en cero, el vector de referencia de una matriz con d índices tiene al menos 1 + 2 d parámetros. Para lenguajes que permiten límites inferiores arbitrarios para índices, como Pascal , el vector dope necesita 1 + 3 d entradas.

Si la abstracción de la matriz no admite índices negativos verdaderos (como, por ejemplo, las matrices de Ada y Pascal ), entonces a veces se utilizan índices negativos para los límites del segmento para una dimensión determinada para especificar un desplazamiento desde el final de la matriz en esa dimensión. En esquemas basados ​​en 1, -1 generalmente indicaría el penúltimo elemento, mientras que en un sistema basado en 0, significaría el último elemento.

Historia

El concepto de slicing seguramente se conocía incluso antes de la invención de los compiladores . El corte como característica del lenguaje probablemente comenzó con FORTRAN (1957), más como consecuencia de una verificación de tipo y rango inexistente que por diseño. El concepto también fue aludido en el informe preliminar de la IAL (ALGOL 58) en el sentido de que la sintaxis permitía omitir uno o más índices de un elemento de matriz (o, de hecho, de una llamada a procedimiento) cuando se usaba como un elemento real. parámetro.

APL (1957) de Kenneth Iverson tenía un corte de matriz multidimensional muy flexible, lo que contribuyó en gran medida al poder expresivo y la popularidad del lenguaje.

ALGOL 68 (1968) introdujo funciones integrales de corte y recorte de matrices multidimensionales.

Se han incorporado funciones de corte de matrices en varios lenguajes modernos, como Ada 2005 , Cobra , D , Fortran 90 , Go , Rust , Julia , MATLAB , Perl , Python , S-Lang , Windows PowerShell y los lenguajes matemáticos/estadísticos GNU Octave . S y R.​

Cronología del corte en varios lenguajes de programación.

1964: PL/I

PL/I proporciona dos funciones para el corte de matrices.

DECLARE X(5,5); DECLARE Y(5) DEFINED(X(1SUB,1SUB));

Una referencia a Y(2)es una referencia a X(2,2), y así sucesivamente.

DECLARE X(5,5); X(*,1)=0;

1966: Fortrán 66

Los programadores de Fortran 66 solo pudieron aprovechar la división de matrices por fila, y solo al pasar esa fila a una subrutina :

  SUBRUTINA IMPRESIÓN V ( VEC , LEN ) REAL VEC ( * ) IMPRESIÓN * , ( VEC ( I ), I = 1 , LEN ) FINAL                 PROGRAMA PARÁMETRO PRINCIPAL ( LEN = 3 ) MATRIZ REAL ( LEN , LEN ) MATRIZ DE DATOS / 1 , 1 , 1 , 2 , 4 , 8 , 3 , 9 , 27 / LLAMADA IMPRESIÓN V ( MATRIZ ( 1 , 2 ), LEN ) FIN                           

Resultado:

 2,000000 4,000000 8,000000

Tenga en cuenta que no existe un vector de droga en FORTRAN 66, por lo tanto, la longitud del segmento también debe pasarse como argumento (o algún otro medio) al archivo SUBROUTINE. Pascal y C de los años 1970 tenían restricciones similares.

1968: Algol 68

El informe final de Algol68 contiene un ejemplo temprano de corte, los cortes se especifican en la forma:

[límite inferior:límite superior] ¢ para computadoras con juegos de caracteres extendidos ¢

o:

(LÍMITE INFERIOR. LÍMITE SUPERIOR) # PARA COMPUTADORAS CON SOLO CARACTERES DE 6 BITS. #

Ambos límites son inclusivos y se pueden omitir, en cuyo caso por defecto son los límites de la matriz declarada. Ni la función de zancada ni los alias de corte diagonal forman parte del informe revisado.

Ejemplos:

[3, 3]real a := ((1, 1, 1), (2, 4, 8), (3, 9, 27)); # declaración de una matriz variable #
[,] real c = ((1, 1, 1), (2, 4, 8), (3, 9, 27)); # matriz constante, el tamaño está implícito #
ref[]fila real := a[2,]; # alias/ referencia a un segmento de fila #
ref[]real col2 = a[, 2]; # alias permanente/ referencia a la segunda columna #
imprimir ((a[:, 2], nueva línea)); # segmento de la segunda columna #
print ((a[1⌈a, :], nueva línea)); # segmento de la última fila #
print ((a[:, 2⌈a], nueva línea)); # último segmento de columna #
imprimir ((a[:2, :2], nueva línea)); # "porción" de submatriz principal de 2 por 2 #
+1,0000 10 +0 +4,0000 10 +0 +9,0000 10 +0+3.0000 10 +0 +9.0000 10 +0 +2.7000 10 +1+1,0000 10 +0 +8,0000 10 +0 +2,7000 10 +1+1,0000 10 +0 +1,0000 10 +0 +2,0000 10 +0 +4,0000 10 +0

1968: BÁSICO

Los sistemas HP 2000 de HP , presentados en noviembre de 1968, utilizaban HP Time-Shared BASIC como interfaz principal y lenguaje de programación. Esta versión de BASIC utilizó corte para la mayoría de las operaciones de manipulación de cadenas. Una rareza del lenguaje era que permitía llaves redondas o cuadradas indistintamente, y lo que se usaba en la práctica era típicamente una función del terminal de computadora que se usaba.

Ejemplo:

10 A$ = "HOLA MUNDO" 20 IMPRIMIR A$ ( 1 , 5 ) 30 IMPRIMIR A$ [ 7 , 11 ]     

Producirá:

HOLAMUNDO

Los sistemas HP se utilizaron ampliamente a principios de la década de 1970, especialmente en escuelas secundarias técnicas y en muchos pequeños entornos industriales y científicos. [3] Cuando surgieron las primeras microcomputadoras a mediados de la década de 1970, HP también se utilizó a menudo como patrón para sus dialectos BASIC. Ejemplos notables incluyen Apple BASIC de 1977 , Atari BASIC de 1978 y Sinclair BASIC de 1979 . Este estilo de manipulación generalmente ofrece ventajas en términos de uso de memoria y, a menudo, se eligió en sistemas que se envían con pequeñas cantidades de memoria. Sólo el dialecto de Sinclair difería de alguna manera significativa, usando la TOpalabra clave en lugar de una lista separada por comas:

10 LET a$ = "ABCDE" ( 2 a 4 ) 20 PRINT a$      

El corte también se seleccionó como base para el estándar ANSI Full BASIC , utilizando los dos puntos como separador y así diferenciando entre corte y acceso a matriz:

10 DIM A$ ( 5 ) 20 LET A$ ( 2 ) = "HOLA MUNDO" 30 PRINT A$ ( 2 )( 1 : 5 )      

Si bien este estilo de acceso ofrecía una serie de ventajas, especialmente para las máquinas pequeñas de la época, en algún momento después de 1970 Digital Equipment Corporation introdujo su propia variación de BASIC que utilizaba las LEFT$funciones de cadena RIGHT$y . Microsoft BASIC se escribió en el PDP-10 y su BASIC se utilizó como patrón. Hasta finales de la década de 1970, ambos estilos se utilizaron ampliamente, pero a principios de la década de 1980 las funciones de estilo DEC eran el estándar de facto .MID$

Década de 1970: MATLAB

>  A  =  round ( rand ( 3 ,  4 ,  5 ) * 10 )  % matriz tridimensional o cúbica de 3x4x5 >  A (:,  :,  3 )  % matriz bidimensional de 3x4 a lo largo de la primera y segunda dimensionesrespuesta  = 8  3  5  7  8  9  1  4  4  4  2  5>  A (:,  2 : 3 ,  3 )  % matriz bidimensional 3x2 a lo largo de la primera y segunda dimensionesrespuesta  = 3  5  9  1  4  2>  A ( 2 : end ,  :,  3 )  % matriz bidimensional 2x4 usando la palabra clave 'end'; funciona con GNU Octava 3.2.4respuesta  = 6  1  4  6  10  1  3  1>  A ( 1 ,  :,  3 )  % matriz unidimensional a lo largo de la segunda dimensiónrespuesta  = 8  3  5  7>  A ( 1 ,  2 ,  3 )  % valor único ans  =  3

1976: S / R

Los arrays en S y GNU R siempre están basados ​​en uno, por lo que los índices de un nuevo segmento comenzarán con uno para cada dimensión, independientemente de los índices anteriores. Las dimensiones con una longitud de uno se eliminarán (a menos que drop = FALSE). Se conservarán los nombres de las dimensiones (cuando estén presentes).

> A <- matriz ( 1 : 60 , dim = c ( 3 , 4 , 5 )) # matriz tridimensional o cúbica de 3x4x5 > A [, , 3 ] # matriz bidimensional de 3x4 a lo largo de la primera y segunda dimensión  [, 1 ] [, 2] [, 3] [, 4] [1,] 25 28 31 34 [2,] 26 29 32 35 [3,] 27 30 33 36 > A [, 2 : 3 , 3 , soltar = FALSO ] # Subconjunto de matriz cúbica de 3x2x1 (dimensiones conservadas) , , 1                  [, 1] [, 2] [1,] 28 31 [2,] 29 32 [3,] 30 33 > A [, 2 , 3 ] # matriz unidimensional a lo largo de la primera dimensión [1] 28 29 30 > A [ 1 , 2 , 3 ] # valor único [1] 28      

1977: Fortran 77

El estándar Fortran 77 introdujo la capacidad de cortar y concatenar cadenas:

PROGRAMA PRINCIPAL IMPRESIÓN * , 'ABCDE' ( 2 : 4 ) FIN   

Produce:

BCD

Dichas cadenas podrían pasarse por referencia a otra subrutina; la longitud también se pasaría de forma transparente a la subrutina como una especie de vector de referencia corto .

SUBRUTINA IMPRIMIR S ( STR ) CARÁCTER * ( * ) STR IMPRIMIR * , STR FINAL     PROGRAMA LLAMADA PRINCIPAL IMPRIMIR S ( 'ABCDE' ( 2 : 4 )) FIN 

De nuevo produce:

BCD

1983: Ada 83 y superior

Ada 83 admite cortes para todo tipo de matrices. Al igual que Fortran 77, tales matrices podrían pasarse por referencia a otra subrutina, la longitud también se pasaría de forma transparente a la subrutina como una especie de vector corto .

con  Texto_IO ; El procedimiento  principal  es  Texto  :  Cadena  : =  "ABCDE" ; comenzar  Text_IO . Put_Line  ( Texto  ( 2  ..  4 )); final  principal ;

Produce:

BCD

Nota: Dado que en Ada los índices están basados ​​en n, el término Text (2 .. 4)dará como resultado una matriz con el índice base de 2.

La definición de Text_IO.Put_Linees:

El paquete  Ada.Text_IO  es  procedimiento  Put_Line ( elemento  : en  cadena );

La definición de Stringes:

paquete  estándar  es subtipo  Positivo  es  rango de enteros  1 .. Entero ' Último ;    el tipo  Cadena  es  una matriz ( rango positivo  <>) de Carácter ; Paquete pragma ( cadena );     

Como Ada apoya los índices negativos verdaderos, type History_Data_Array is array (-6000 .. 2010) of History_Data;no les da ningún significado especial. En el ejemplo anterior, el término Some_History_Data (-30 .. 30)dividiría el History_Dataaño 31 a. C. al 30 d. C. (dado que no hubo un año cero, el año número 0 en realidad se refiere al 1 a. C. ).

1987: perla

si tenemos

@a = ( 2 , 5 , 7 , 3 , 8 , 6 , 4 );        

Como arriba, entonces los primeros 3 elementos, los 3 elementos del medio y los últimos 3 elementos serían:

@a [ 0 .. 2 ]; # (2, 5, 7) @a [ 2 .. 4 ]; # (7, 3, 8) @a [ - 3 ..- 1 ]; # (8, 6, 4)   

Perl admite índices de listas negativas. El índice -1 es el último elemento, -2 el penúltimo elemento, etc. Además, Perl admite el corte basado en expresiones, por ejemplo:

@a [ 3 .. $#a ]; # 4to elemento hasta el final (3, 8, 6, 4) @a [ grep { ! ( $_ % 3 ) } ( 0 ... $#a ) ]; # 1.º, 4.º y 7.º elemento (2,3,4) @a [ grep { ! (( $_ + 1 ) % 3 ) } ( 0 .. $#a ) ]; # cada 3er elemento (7,6)                      

1991: pitón

Si tiene la siguiente lista:

>>> números  =  [ 1 ,  3 ,  5 ,  7 ,  8 ,  13 ,  20 ]

Entonces es posible dividir usando una notación similar a la recuperación de elementos:

>>> nums [ 3 ]  # sin corte 7 >>> nums [: 3 ]  # desde el índice 0 (inclusive) hasta el índice 3 (exclusivo) [1, 3, 5] >>> nums [ 1 : 5 ] [3 , 5, 7, 8] >>> números [ - 3 :] [8, 13, 20]

Tenga en cuenta que Python permite índices de listas negativas. El índice -1 representa el último elemento, -2 el penúltimo elemento, etc. Python también permite una propiedad de paso agregando dos puntos adicionales y un valor. Por ejemplo:

>>> números [ 3 :] [7, 8, 13, 20] >>> números [ 3 ::]  # == números[3:] [7, 8, 13, 20] >>> números [:: 3 ]  # comenzando en el índice 0 y obteniendo cada tercer elemento [1, 7, 20] >>> nums [ 1 : 5 : 2 ]  # desde el índice 1 hasta el índice 5 y obteniendo cada segundo elemento [3, 7]

La sintaxis stride ( nums[1:5:2]) se introdujo en la segunda mitad de la década de 1990, como resultado de las solicitudes realizadas por los usuarios científicos en el "matrix-SIG" de Python (grupo de interés especial). [4]

La semántica de los sectores difiere potencialmente según el objeto; Se puede introducir nueva semántica cuando el operador sobrecarga el operador de indexación. Con las listas estándar de Python (que son matrices dinámicas ), cada segmento es una copia. Por el contrario, las porciones de matrices NumPy son vistas del mismo búfer subyacente.

1992: Fortran 90 y superior

En Fortran 90, los sectores se especifican en la forma

límite_inferior : límite_superior [: paso ]

Ambos límites son inclusivos y se pueden omitir, en cuyo caso por defecto son los límites de la matriz declarada. El valor predeterminado de zancada es 1. Ejemplo:

real , dimensión ( m , n ) :: a ! declaración de una matriz print * , a (:, 2 ) ! segunda columna print * , a ( m , :) ! última fila print * , a (: 10 , : 10 ) ! submatriz principal de 10 por 10                 

1994: Analítica

Cada dimensión de un valor de matriz en Analytica se identifica mediante una variable de índice. Al dividir o subíndice, la sintaxis identifica las dimensiones sobre las cuales se está segmentando o subíndice nombrando la dimensión. Como:

Índice I := 1..5 { Definición de índice numérico }Índice J := ['A', 'B', 'C'] { Definición de un índice con valores de texto }Variable X := Array(I, J, [[10, 20, 30], [1, 2, 3], ....]) { Definición de un valor 2D }X[I = 1, J = 'B'] -> 20 { Subíndice para obtener un valor único }X[I = 1] -> Array(J, [10, 20, 30]) { Cortar una matriz 1D. }X[J = 2] -> Array(I, [20, 2, ....]) { Corta una matriz 1D sobre la otra dimensión. }X[I = 1..3] {Corte los primeros cuatro elementos sobre I con todos los elementos sobre J}

Nombrar índices en divisiones y subíndices es similar a nombrar parámetros en llamadas a funciones en lugar de depender de una secuencia fija de parámetros. Una ventaja de nombrar índices en el corte es que el programador no tiene que recordar la secuencia de índices en una matriz multidimensional. Una ventaja más profunda es que las expresiones se generalizan de forma automática y segura sin necesidad de reescribirlas cuando cambia el número de dimensiones de X.

1998: S-Lang

La división de matrices se introdujo en la versión 1.0. Las versiones anteriores no admitían esta función.

Supongamos que A es una matriz unidimensional como

 A = [1:50]; %A = [1, 2, 3, ...49, 50]

Entonces se puede crear una matriz B de los primeros 5 elementos de A usando

 B = A[[:4]];

De manera similar, B puede asignarse a una matriz de los últimos 5 elementos de A mediante:

 B = A[[-5:]];

Otros ejemplos de corte 1-d incluyen:

 A[-1] % El último elemento de A A[*] % Todos los elementos de A A[[::2]] % Todos los elementos pares de A A[[1::2]] % Todos los elementos impares de A A[[-1::-2]] % Todos los elementos pares en orden inverso A[[[0:3], [10:14]]] % Elementos 0-3 y 10-14

El corte de matrices de dimensiones superiores funciona de manera similar:

 A[-1, *] % La última fila de A A[[1:5], [2:7]] % matriz 2d usando las filas 1-5 y las columnas 2-7 A[[5:1:-1], [2:7]] % Igual que arriba excepto que las filas están invertidas

Los índices de matriz también pueden ser matrices de números enteros. Por ejemplo, supongamos que I = [0:9]es una matriz de 10 números enteros. Entonces A[I]es equivalente a una matriz de los primeros 10 elementos de A. Un ejemplo práctico de esto es una operación de clasificación como:

 Yo = array_sort(A); % Obtener una lista de índices de clasificación B = A[I]; % B es la versión ordenada de A C = A[array_sort(A)]; % Igual que el anterior pero más conciso.

1999: re

Considere la matriz:

int [] a = [ 2 , 5 , 7 , 3 , 8 , 6 , 4 , 1 ];          

Sácale un trozo:

int [] b = a [ 2 .. 5 ];     

y el contenido de bserá [7, 3, 8]. El primer índice del sector es inclusivo, el segundo es exclusivo.

auto c = a [$ - 4 .. $ - 2 ];         

significa que la matriz dinámica cahora contiene [8, 6]porque dentro de [] el $símbolo se refiere a la longitud de la matriz.

Los sectores de la matriz D tienen un alias con respecto a la matriz original, por lo que:

segundo [ 2 ] = 10 ;  

significa que aahora tiene el contenido [2, 5, 7, 3, 10, 6, 4, 1]. Para crear una copia de los datos de la matriz, en lugar de solo un alias, haga:

auto b = a [ 2 .. 5 ]. duplicar ;     

A diferencia de Python, los límites del segmento D no se saturan, por lo que el código equivalente a este código Python es un error en D:

>>> re  =  [ 10 ,  20 ,  30 ] >>> re [ 1  :  5 ] [20, 30]

2004: Supercolisionador

El lenguaje de programación SuperCollider implementa algunos conceptos de J / APL . El corte se ve de la siguiente manera:

a  =  [ 3 ,  1 ,  5 ,  7 ]  // asigna una matriz a la variable a a [ 0 .. 1 ] //  devuelve los dos primeros elementos de a a [.. 1 ]  // devuelve los dos primeros elementos de a: el cero se puede omitir a [ 2 ..]  // devuelve el elemento 3 hasta el último a [[ 0 ,  3 ]]  // devuelve el primer y cuarto elemento de aa [[ 0 ,  3 ]]  =  [ 100 ,  200 ]  // reemplaza el primer y cuarto elemento de a a [ 2 ..]  =  [ 100 ,  200 ]  // reemplaza los dos últimos elementos de a// asigna una matriz multidimensional a la variable a a  =  [[ 0 ,  1 ,  2 ,  3 ,  4 ],  [ 5 ,  6 ,  7 ,  8 ,  9 ],  [ 10 ,  11 ,  12 ,  13 ,  14 ],  [ 15 ,  16 ,  17 ,  18 ,  19 ]];  a . rebanada ( 2 ,  3 );  // toma un segmento con coordenadas 2 y 3 (devuelve 13) a . rebanada ( nula ,  3 );  // toma un corte ortogonal (devuelve [3, 8, 13, 18])

2005: pez

Las matrices en pescado siempre tienen una base uno, por lo que los índices de un nuevo segmento comenzarán con uno , independientemente de los índices anteriores.

>  set A ( seq 3  2 11 )  # $A es una matriz con los valores 3, 5, 7, 9, 11 >  echo  $A [( seq 2 )]  # Imprime los dos primeros elementos de $A 3 5 >  set B $A [ 1 2 ]  # $B contiene el primer y segundo elemento de $A, es decir, 3, 5 >  establecer -e A [ $B ] ;  echo  $A  # Borra el tercer y quinto elemento de $A, imprime $A 3  5 9

2006: cobra

Cobra admite el corte al estilo Python. Si tienes una lista

números  =  [ 1 ,  3 ,  5 ,  7 ,  8 ,  13 ,  20 ]

entonces los primeros 3 elementos, los 3 elementos del medio y los últimos 3 elementos serían:

números [: 3 ]  # es igual a [1, 3, 5] números [ 2 : 5 ]  # es igual a [5, 7, 8] números [ - 3 :]  # es igual a [8, 13, 20]

Cobra también admite la sintaxis de estilo de corte para 'bucles for numéricos':

para  i  en  2  :  5  print  i # imprime 2, 3, 4para  j  en  3  imprimir  j # imprime 0, 1, 2

2006: WindowsPowerShell

Las matrices tienen base cero en PowerShell y se pueden definir mediante el operador de coma:

PS> $a  =  2 ,  5 ,  7 ,  3 ,  8 ,  6 ,  4 ,  1 PS> # Imprime los dos primeros elementos de $a: PS> Write-Host  -NoNewline  $a [ 0 ,  1 ] 2 5 PS> # Tome una porción usando el operador de rango: PS> Write-Host  -NoNewline  $a [ 2 .. 5 ] 7 3 8 6 PS> # Obtenga los últimos 3 elementos: PS> Write-Host  -NoNewline  $a [ - 3 ..- 1 ] 6 4 1 PS> # Devuelve el contenido de la matriz en orden inverso: PS> Write-Host  -NoNewline  $a [( $a . Longitud  -  1 ).. 0 ]  # La longitud es una propiedad de System.Object[] 1 4 6 8 3 7 5 2

2009: ir

Go admite la sintaxis de estilo Python para el corte (excepto que no se admiten índices negativos). Se pueden cortar matrices y cortes. Si tienes una rebanada

números : = [] int { 1 , 3 , 5 , 7 , 8 , 13 , 20 }        

entonces los primeros 3 elementos, los 3 elementos del medio, los últimos 3 elementos y una copia del segmento completo serían:

nums [: 3 ] // es igual a []int{1, 3, 5} nums [ 2 : 5 ] // es igual a []int{5, 7, 8} nums [ 4 :] // es igual a []int{8 , 13, 20} números [:] // es igual a []int{1, 3, 5, 7, 8, 13, 20}    

Los sectores en Go son tipos de referencia, lo que significa que diferentes sectores pueden hacer referencia a la misma matriz subyacente.

2010: Cilk Plus

Cilk Plus admite la sintaxis para la división de matrices como una extensión de C y C++.

base_matriz [ límite_inferior : longitud [ : zancada ]] * 

El corte de Cilk Plus tiene el siguiente aspecto:

A [ : ] // Todo el vector A B [ 2 : 6 ] // Elementos 2 a 7 del vector B C [ : ][ 5 ] // Columna 5 de la matriz C D [ 0 : 3 : 2 ] // Elementos 0, 2, 4 del vector D    

La división de matrices de Cilk Plus se diferencia de la de Fortran en dos formas:

2012: Julia

El corte de matrices de Julia es como el de MATLAB , pero usa corchetes. Ejemplo:

julia> x = rand ( 4 , 3 ) 4x3 Array{Float64,2}: 0.323877 0.186253 0.600605 0.404664 0.894781 0.0955007 0.223562 0.18859 0.120011 0.149316 0 .779823 0.0690126    julia> x [ : , 2 ] # obtiene la segunda columna. Matriz de 4 elementos {Float64,1}: 0,186253 0,894781 0,18859 0,779823   julia> x [ 1 , : ] # obtiene la primera fila. Matriz 1x3 {Float64,2}: 0,323877 0,186253 0,600605   julia> x [ 1 : 2 , 2 : 3 ] # obtiene la submatriz que abarca las filas 1,2 y las columnas 2,3 2x2 Array{Float64,2}: 0.186253 0.600605 0.894781 0.0955007  

Ver también

Referencias

  1. ^ Zhang, Zemin; Aeron, Shuchin (15 de marzo de 2017). "Finalización exacta del tensor utilizando t-SVD". Transacciones IEEE sobre procesamiento de señales . Instituto de Ingenieros Eléctricos y Electrónicos (IEEE). 65 (6): 1511-1526. arXiv : 1502.04689 . doi : 10.1109/tsp.2016.2639466 . ISSN  1053-587X.
  2. ^ ab IBM Corporation (1995). PL/I para referencia de lenguajes MVS y VM .
  3. ^ "Pasando la marca de los 10 años". Revista MEDIDA . Hewlett Packard. Octubre de 1976.
  4. ^ Millman, K. Jarrod; Aivazis, Michael (2011). "Python para científicos e ingenieros". Computación en Ciencias e Ingeniería . 13 (2): 9–12. doi :10.1109/MCSE.2011.36.