arrays - seleccionar - matrices en matlab programacion
¿Cuál es la forma idiomática de cortar una matriz en relación con sus dos extremos? (6)
La notación de matriz de Powershell tiene un comportamiento bastante extraño, aunque documentado, para cortar el final de las matrices. Esta sección de la documentación oficial resume bastante bien la rareza:
Los números negativos cuentan desde el final de la matriz. Por ejemplo, "-1" se refiere al último elemento de la matriz. Para mostrar los últimos tres elementos de la matriz, escriba:
$a[-3..-1]
Sin embargo, tenga cuidado al usar esta notación.
$a[0..-2]
Este comando no se refiere a todos los elementos de la matriz, a excepción de la última. Se refiere al primer, último y penúltimo elemento de la matriz.
El siguiente código confirma la rareza:
$a = 0,1,2,3
$a[1..-1]
Que de hecho produce este extraño resultado:
1
0
3
Entonces, la pregunta es, ¿cuál es la forma idiomática de cortar con un índice relativo al inicio y otro relativo al final de la matriz?
Por favor dime que es algo mejor que este desastre feo:
$a[1..($a.Count-1)]
Editar:
Otra forma de describir lo que estoy buscando es esto: el equivalente idiomático de Powershell de esta expresión de pitón:
a=1,2,3,4
a[1:-1]
Que, por supuesto, evalúa a (2,3)
Aunque no es tan limpio como podría desear, pero es más limpio en la forma en que funciona PowerShell ...
(@(1,2,3,4)) | Select-Object -Skip 1
devoluciones ...
2
3
4
Creo que esta es la forma correcta de hacerlo. todos los demás métodos requieren más código.
$a[1..($a.Count-1)]
Además, si la matriz se convierte en cadena, es fácil obtener datos de la siguiente manera:
$a = 0,1,2,3
[string]::Concat($a).Substring(1)
Está bien, así que es feo como el infierno pero me parece que funciona [1..99] o [1.999]. Sin embargo, no utilice [1.999999] ya que PowerShell genera una matriz de valores primero antes de decidir que solo los primeros cinco importan, el último requiere mucho tiempo para generar previamente un conjunto de un millón de elementos.
Esto es ideal para ciertos escenarios de scripting, horrible para el código de producción.
Esta podría ser la forma más idiomática de cortar una matriz con sus dos extremos:
$ array [start..stop] donde stop se define tomando la longitud de la matriz menos un valor para compensar desde el final de la matriz:
$a = 1,2,3,4,5,6,7,8,9
$start = 2
$stop = $a.Length-3
$a[$start..$stop]
Esto devolverá 3 4 5 6 7
El valor de inicio comienza contando con cero, por lo que un valor inicial de ''2'' le proporciona el tercer elemento de la matriz. El valor de detención se calcula con ($ a.Length-3), esto soltará los dos últimos valores porque $ a.Length-3 se incluye en el sector.
He definido $ start y $ stop para mayor claridad, obviamente también puedes escribirlo así:
$a = 1,2,3,4,5,6,7,8,9
$a[2..($a.Length-3)]
Esto también devolverá 3 4 5 6 7
Si desea obtener n elementos del final de una matriz, simplemente busque los elementos de -n a -1 :
PS C:/> $a = 0,1,2,3
PS C:/> $n = 2
PS C:/> $a[-$n..-1]
2
3
Editar: PowerShell no es compatible con la indexación relativa tanto al principio como al final de la matriz, debido a la forma en que funciona $a[$i..$j]
. En una expresión de Python a[i:j]
usted especifica i
y j
como el primer y último índice, respectivamente. Sin embargo, en un PowerShell ..
es el operador de rango , que genera una secuencia de números. En una expresión $a[$i..$j]
el intérprete primero evalúa $i..$j
en una lista de enteros, y luego la lista se usa para recuperar los elementos de la matriz en estos índices:
PS C:/> $a = 0,1,2,3
PS C:/> $i = 1; $j = -1
PS C:/> $index = $i..$j
PS C:/> $index
1
0
-1
PS C:/> $a[$index]
1
0
3
Si necesita emular el comportamiento de Python, debe usar una subexpresión:
PS C:/> $a = 0,1,2,3
PS C:/> $i = 1; $j = -1
PS C:/> $a[$i..($a.Length+$j-1)]
1
2
Si está buscando, por ejemplo, los primeros tres y los últimos tres elementos en una matriz, con los resultados en una matriz, una pequeña adición adicional se encargará de la necesidad.
[array]$A = (([int][char]''A'')..([int][char]''Z'')) | ForEach-Object {[char]$_}
$B = $A[0..2]+$A[-3..-1]
Clear-Host
Write-Host "Original List"
Write-Host $A -NoNewline -Separator '', ''
Write-Host
Write-Host "First three and last three"
Write-Host $B -NoNewline -Separator '', ''
Rendimientos:
Original List
A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z
First three and last three
A, B, C, X, Y, Z