9. Matriser

9.1 Introduktion

PowerShell stöder matriser med en eller flera dimensioner där varje dimension har noll eller flera element. Inom en dimension numreras element i stigande heltalsordning med början vid noll. Alla enskilda element kan nås via matrisens subscript-operator [] (7.1.4). Antalet dimensioner i en matris kallas dess rangordning.

Ett element kan innehålla ett värde av valfri typ, inklusive en matristyp. En matris som har ett eller flera element vars värden är av valfri matristyp kallas för en ojämn matris. En flerdimensionell matris har flera dimensioner, vilket innebär att antalet element i varje rad i en dimension är detsamma. Ett element i en taggad matris kan innehålla en flerdimensionell matris och vice versa.

Flerdimensionella matriser lagras i rad major-ordning. Antalet element i en matris kallas för matrisens längd, som är fast när matrisen skapas. Därför kan elementen i en 1-dimensionell matris med längden N nås (dvs. nedsänkt ) med hjälp av uttrycken A[0], A[1], ..., A[N-1]. Elementen i en 2-dimensionell matris B med M-rader , där varje rad har N kolumner, kan nås med hjälp av uttrycken B[0,0], B[0,1], ..., B[0,N-1], B[1,0], B[1,1], ..., B[1,N-1], ..., B[M-1,0], B[M-1,1], ..., B[M-1,N-1]. Och så vidare för matriser med tre eller fler dimensioner.

Som standard är en matris polymorfisk. Det vill säga att elementen inte behöver ha samma typ. Exempel:

$items = 10,"blue",12.54e3,16.30D # 1-D array of length 4
$items[1] = -2.345
$items[2] = "green"

$a = New-Object 'object[,]' 2,2 # 2-D array of length 4
$a[0,0] = 10
$a[0,1] = $false
$a[1,0] = "red"
$a[1,1] = $null

En 1-dimensionell type[]matris har typen , en 2-dimensionell type[,]matris har typen , en 3-dimensionell type[,,]matris har typen och så vidare, där typen är objekt för en matris av typen unconstrained eller den begränsade typen för en begränsad matris (9.4).

Alla matristyper härleds från typen Matris (4.3.2).

9.2 Skapa matris

En matris skapas via ett uttryck för matrisskapande som har följande former: en enkel kommaoperator (·7.2.1), matrisuttryck (·7.1.7), binär kommaoperator (·7.3), intervalloperator (·7.4) eller New-Object-cmdlet .

Här följer några exempel på skapande och användning av matriser:

$values = 10, 20, 30
for ($i = 0; $i -lt $values.Length; ++$i) {
    "`$values[$i] = $($values[$i])"
}

$x = , 10                         # x refers to an array of length 1
$x = @(10)                        # x refers to an array of length 1
$x = @()                          # x refers to an array of length 0

$a = New-Object 'object[,]' 2, 2  # create a 2x2 array of anything
$a[0, 0] = 10                     # set to an int value
$a[0, 1] = $false                 # set to a boolean value
$a[1, 0] = "red"                  # set to a string value
$a[1, 1] = 10.50D                 # set to a decimal value
foreach ($e in $a) {              # enumerate over the whole array
    $e
}

Följande skrivs till pipelinen:

$values[0] = 10
$values[1] = 20
$values[2] = 30

10
False
red
10.50

Standardvärdet för ett element som inte uttryckligen initieras är standardvärdet för elementets typ ( $falsedet vill säga , noll eller $null).

9.3 Sammanfogning av matris

Matriser av godtycklig typ och längd kan sammanfogas via + += operatorerna och , vilket leder till att en ny ej tränad 1-dimensionell matris skapas. De befintliga matriserna är oförändrade. Mer information och -9.4 finns i mer information om att lägga till i en matris med begränsad typ i .7.7.3 .

9.4 Begränsning av elementtyper

En 1-dimensionell matris kan skapas så att den är typbegränsad genom att prefixet för uttrycket för att skapa matriser föregås av en typbyte av matris. Exempel:

$a = [int[]](1,2,3,4)   # constrained to int
$a[1] = "abc"           # implementation-defined behavior
$a += 1.23              # new array is unconstrained

Syntaxen för att skapa en flerdimensionell matris kräver en specifikation av en typ, och den typen blir begränsningstyp för den matrisen. Men genom att ange typen object[]finns det egentligen ingen begränsning eftersom ett värde av någon typ kan tilldelas till ett element i en matris av den typen.

Om du sammanfogar två matriser (7.7.3) resulterar det alltid i en ny matris som inte är tränad även om båda matriserna är begränsade av samma typ. Exempel:

$a = [int[]](1,2,3)    # constrained to int
$b = [int[]](10,20)    # constrained to int
$c = $a + $b           # constraint not preserved
$c = [int[]]($a + $b)  # result explicitly constrained to int

9.5 Matriser som referenstyper

Eftersom matristyper är referenstyper kan en variabel som anger en matris göras för att referera till valfri matris av valfri rangordning, längd och elementtyp. Exempel:

$a = 10,20                     # $a refers to an array of length 2
$a = 10,20,30                  # $a refers to a different array, of length 3
$a = "red",10.6                # $a refers to a different array, of length 2
$a = New-Object 'int[,]' 2,3   # $a refers to an array of rank 2

Tilldelningen av en matris omfattar en grundkopia. det vill säga att variabeln som tilldelats till refererar till samma matris, ingen kopia av matrisen görs. Exempel:

$a = 10,20,30
">$a<"
$b = $a         # make $b refer to the same array as $a
">$b<"

$a[0] = 6       # change value of [0] via $a
">$a<"
">$b<"          # change is reflected in $b

$b += 40        # make $b refer to a new array
$a[0] = 8       # change value of [0] via $a
">$a<"
">$b<"          # change is not reflected in $b

Följande skrivs till pipelinen:

>10 20 30<
>10 20 30<
>6 20 30<
>6 20 30<
>8 20 30<
>6 20 30 40<

9.6 Matriser som matriselement

Alla element i en matris kan i sig vara en matris. Exempel:

$colors = "red", "blue", "green"
$list = $colors, (,7), (1.2, "yes") # parens in (,7) are redundant; they
                                    # are intended to aid readability
"`$list refers to an array of length $($list.Length)"
">$($list[1][0])<"
">$($list[2][1])<"

Följande skrivs till pipelinen:

$list refers to an array of length 3
>7<
>yes<

$list[1] refererar till en matris med 1-element, heltal 7, som nås via $list[1][0], enligt bilden. Jämför detta med följande andra fall:

$list = $colors, 7, (1.2, "yes") # 7 has no prefix comma
">$($list[1])<"

Här refererar $list[1] till en skalär, heltal 7, som nås via $list[1].

Titta på följande exempel:

$x = [string[]]("red","green")
$y = 12.5, $true, "blue"
$a = New-Object 'object[,]' 2,2
$a[0,0] = $x               # element is an array of 2 strings
$a[0,1] = 20               # element is an int
$a[1,0] = $y               # element is an array of 3 objects
$a[1,1] = [int[]](92,93)   # element is an array of 2 ints

9.7 Negativ uppskrivning

Detta beskrivs i -7.1.4.1.

9.8 Gränskontroll

Detta beskrivs i -7.1.4.1.

9.9 Matrissegment

Ett matrissegment är en icke-tränad 1-dimensionell matris vars element är kopior av noll eller flera element från en samling. Ett matrissegment skapas via subscript-operatorn [] (7.1.4.5).

9.10 Kopiera en matris

En sammanhängande uppsättning element kan kopieras från en matris till en annan med hjälp av metoden [Array]::Copy. Exempel:

$a = [int[]](10,20,30)
$b = [int[]](0,1,2,3,4,5)
[Array]::Copy($a, $b, 2)        # $a[0]->$b[0],
$a[1]->$b[1]
[Array]::Copy($a, 1, $b, 3, 2)  # $a[1]->$b[3],
$a[2]->$b[4]

9.11 Räkna upp över en matris

Även om det är möjligt att loopa genom en matris som har åtkomst till varje element via subscript-operatorn kan vi räkna upp över matrisens element med hjälp av foreach-instruktionen. För en flerdimensionell matris bearbetas elementen i rad major-ordning. Exempel:

$a = 10, 53, 16, -43
foreach ($elem in $a) {
    # do something with element via $e
}

foreach ($elem in -5..5) {
    # do something with element via $e
}

$a = New-Object 'int[,]' 3, 2
foreach ($elem in $a) {
    # do something with element via $e
}

9.12 Utplattning av flerdimensionell matris

Vissa åtgärder på en flerdimensionell matris (till exempel replikering (7.6.3) och sammanfogning (7.7.3)) kräver att matrisen plattas ut. det vill säga att omvandlas till en 1-dimensionell matris av ej tränad typ. Den resulterande matrisen tar på alla element i rad major-ordning.

Se följande exempel:

$a = "red",$true
$b = (New-Object 'int[,]' 2,2)
$b[0,0] = 10
$b[0,1] = 20
$b[1,0] = 30
$b[1,1] = 40
$c = $a + $b

Matrisen som anges av $c innehåller elementen "red", $true, 10, 20, 30 och 40.