Sdílet prostřednictvím


Matice (F#)

Pole jsou pevné velikosti, nula-založena proměnlivých kolekcí dat po sobě následující prvky, které jsou stejného typu.

Vytváření polí

Můžete vytvořit pole několika způsoby.Můžete vytvořit malé pole seznam po sobě následujících hodnot mezi [| a |] a odděleny středníkem, jak je uvedeno v následujících příkladech.

let array1 = [| 1; 2; 3 |]

Každý prvek můžete také umístit na samostatném čára, ve kterém je volitelné případ oddělovač středník.

let array1 = 
    [|
        1
        2
        3
     |]

Typ prvků pole je odvodit ze literály použit a musí být v souladu.Následující kód způsobí chyba , protože 1.0 je plovoucí a 2 a 3 jsou celá čísla.

// Causes an error.
// let array2 = [| 1.0; 2; 3 |] 

Můžete také sekvence výrazů k vytvořit pole.Je příklad, který vytvoří pole čtverců celá čísla od 1 do 10.

let array3 = [| for i in 1 .. 10 -> i * i |]

vytvořit vlastní pole, ve kterém všechna jsou prvky inicializovány na nulapomocí Array.zeroCreate.

let arrayOfTenZeroes : int array = Array.zeroCreate 10

Přístup k prvky

Prvky pole lze přístup pomocí tečkou operátor (.) a hranaté závorky ([a]).

array1.[0]

Indexy pole začínají na 0.

Získat přístup k prvky pole pomocí zápisu řezu, který umožňuje určit Podrozsah matice.Příklady zápisu řezu.

// Accesses elements from 0 to 2.
array1.[0..2]  
// Accesses elements from the beginning of the array to 2.
array1.[..2] 
// Accesses elements from 2 to the end of the array.
array1.[2..] 

Při zápisu řez je novou kopii pole je vytvořen.

Typy polí a moduly

Typ F# matic.NET rozhraní .NET Framework typu Array.Proto matice F# podporují všechny funkce v Array.

knihovnamodulMicrosoft.FSharp.Collections.Array podporuje operace pro jednorozměrné pole. Moduly Array2D, Array3D, a Array4D obsahovat funkce, které podporují operace dva, tři a čtyři dimenze matice resp..Můžete vytvořit pole větší než čtyři pomocí zařadit Array.

Dd233214.collapse_all(cs-cz,VS.110).gifJednoduché funkce

Array.Get získá prvek.Array.length udává délku pole.Array.set Nastaví prvek na zadanou hodnotu.Následující příklad kódu ukazuje použití těchto funkcí.

let array1 = Array.create 10 ""
for i in 0 .. array1.Length - 1 do
    Array.set array1 i (i.ToString())
for i in 0 .. array1.Length - 1 do
    printf "%s " (Array.get array1 i)

Výstup je takto.

0 1 2 3 4 5 6 7 8 9

Dd233214.collapse_all(cs-cz,VS.110).gifFunkce, které vytvoření polí

Několik funkcí vytvořit pole bez nutnosti existujícího pole.Array.Empty vytvoří nové pole, který neobsahuje žádné prvky.Pole.vytvořit vytvoří pole určené velikosti a nastaví všechny prvky na zadané hodnoty.Array.init vytvoří pole, dimenze a funkce generovat prvky.Array.zeroCreate vytvoří ve všech prvků jsou inicializovány nula hodnoty pro pole typu pole.Následující kód ukazuje tyto funkce.

let myEmptyArray = Array.empty
printfn "Length of empty array: %d" myEmptyArray.Length

printfn "Array of floats set to 5.0: %A" (Array.create 10 5.0)
printfn "Array of squares: %A" (Array.init 10 (fun index -> index * index))
let (myZeroArray : float array) = Array.zeroCreate 10

Výstup je takto.

Length of empty array: 0
Area of floats set to 5.0: [|5.0; 5.0; 5.0; 5.0; 5.0; 5.0; 5.0; 5.0; 5.0; 5.0|]
Array of squares: [|0; 1; 4; 9; 16; 25; 36; 49; 64; 81|]

Array.copy vytvoří nové pole, které obsahuje prvky, které jsou zkopírovány z existujícího pole.Kopii představuje mělká kopie, což znamená, že pokud typ odkazovat se typu prvku, bude zkopírována pouze odkazovat se , není základní objekt.Následující příklad kódu ukazuje to.

open System.Text

let firstArray : StringBuilder array = Array.init 3 (fun index -> new StringBuilder(""))
let secondArray = Array.copy firstArray
// Reset an element of the first array to a new value.
firstArray.[0] <- new StringBuilder("Test1")
// Change an element of the first array.
firstArray.[1].Insert(0, "Test2") |> ignore
printfn "%A" firstArray
printfn "%A" secondArray

Výstup předchozího kódu je následující:

[|Test1; Test2; |]
[|; Test2; |]

Řetězec Test1 se zobrazí pouze v prvním poli, protože operace vytvoření nového prvku přepíše odkazovat se v firstArray , ale nemá vliv na původní odkazovat se na prázdný řetězec, který je stále ještě v secondArray.Řetězec Test2 se zobrazí v obou polích, protože Insert operace StringBuilder typ ovlivňuje základní StringBuilder objekt, který je odkazován v obou polích.

Array.Sub generuje nové pole z Podrozsah matice.Podrozsah určíte počáteční index a délku.Následující kód ukazuje použití Array.sub.

let a1 = [| 0 .. 99 |]
let a2 = Array.sub a1 5 10
printfn "%A" a2

Výstup ukazuje, že subarray začíná prvek 5 a obsahuje prvky 10.

[|5; 6; 7; 8; 9; 10; 11; 12; 13; 14|]

Pole.připojit vytvoří nové pole kombinací dvou existujících polí.

Následující kód ukazuje Array.append.

printfn "%A" (Array.append [| 1; 2; 3|] [| 4; 5; 6|])

Výstup předchozího kódu je následující.

[|1; 2; 3; 4; 5; 6|]

Array.Choose vybere prvky pole zahrnout do nového pole.Následující kód ukazuje Array.choose.Všimněte si, že není nutné odpovídat typu hodnota vrácená v možnosti Typ prvku matice.V tomto příkladu je typ prvku int a možnost je výsledek polynomické funkce elem*elem - 1, jako číslo číslo s plovoucí desetinnou čárkou .

printfn "%A" (Array.choose (fun elem -> if elem % 2 = 0 then
                                            Some(float (elem*elem - 1))
                                        else
                                            None) [| 1 .. 10 |])

Výstup předchozího kódu je následující.

[|3.0; 15.0; 35.0; 63.0; 99.0|]

Array.Collect spouští určenou funkce na každý prvek pole existujícího pole prvků generovaných funkce shromažďuje a sloučí do nového pole.Následující kód ukazuje Array.collect.

printfn "%A" (Array.collect (fun elem -> [| 0 .. elem |]) [| 1; 5; 10|])

Výstup předchozího kódu je následující.

[|0; 1; 0; 1; 2; 3; 4; 5; 0; 1; 2; 3; 4; 5; 6; 7; 8; 9; 10|]

Array.Concat trvá sekvence polí a je kombinuje do jednoho pole.Následující kód ukazuje Array.concat.

let multiplicationTable max = seq { for i in 1 .. max -> [| for j in 1 .. max -> (i, j, i*j) |] }
printfn "%A" (Array.concat (multiplicationTable 3))

Výstup předchozího kódu je následující.

[|(1, 1, 1); (1, 2, 2); (1, 3, 3); (2, 1, 2); (2, 2, 4); (2, 3, 6); (3, 1, 3);
  (3, 2, 6); (3, 3, 9)|]

Array.Filter trvá logický podmínkou funkce a generuje nové pole, které obsahuje pouze prvky z vstupní pole, pro které je podmínka splněna.Následující kód ukazuje Array.filter.

printfn "%A" (Array.filter (fun elem -> elem % 2 = 0) [| 1 .. 10|])

Výstup předchozího kódu je následující.

[|2; 4; 6; 8; 10|]

Array.rev generuje nové pole přehozením pořadí existujícího pole.Následující kód ukazuje Array.rev.

let stringReverse (s: string) =
    System.String(Array.rev (s.ToCharArray()))

printfn "%A" (stringReverse("!dlrow olleH"))

Výstup předchozího kódu je následující.

"Hello world!"

Snadno lze kombinovat funkce array modul , které transformace matice pomocí potrubí operátor (| >), jak ukazuje následující příklad.

[| 1 .. 10 |]
|> Array.filter (fun elem -> elem % 2 = 0)
|> Array.choose (fun elem -> if (elem <> 8) then Some(elem*elem) else None)
|> Array.rev
|> printfn "%A"

Výstup je

[|100; 36; 16; 4|]

Dd233214.collapse_all(cs-cz,VS.110).gifVícedimenzionální pole

Lze vytvořit vícedimenzionální pole, ale neexistuje žádná syntaxe literálu multidimenzionální pole.Použijte operátorarray2D pro vytvořit pole z sekvence prvků pole řad. Na sekvence může být literály array nebo seznam.Například následující kód vytváří dvojrozměrné.

let my2DArray = array2D [ [ 1; 0]; [0; 1] ]

Můžete také použít funkceArray2D.init inicializace pole dva rozměry a podobné funkce jsou k dispozici pro pole dimenzí tři a čtyři. Tyto funkce převzít funkce , která je použita k vytvořit prvků.vytvořit dvourozměrné pole obsahující prvky nastavit počáteční hodnotu namísto funkce, použít Array2D.vytvořitfunkce, která je také k dispozici pro maticových až čtyři dimenze. Následující příklad kódu nejprve ukazuje, jak vytvořit maticových pole, která obsahuje požadované prvky a poté používá Array2D.init ke generování požadované dvourozměrné pole.

let arrayOfArrays = [| [| 1.0; 0.0 |]; [|0.0; 1.0 |] |]
let twoDimensionalArray = Array2D.init 2 2 (fun i j -> arrayOfArrays.[i].[j]) 

Matice indexování a řezání syntaxe je podporován pro pole do zařadit 4.Při zadání indexu v více dimenzí můžete oddělujte indexů, jak je znázorněno v následujícím příkladu kódu.

twoDimensionalArray.[0, 1] <- 1.0

Typ dvourozměrné pole je zapsána, jako <type>[,] (například int[,], double[,]), a typ trojrozměrné je zapsán jako <type>[,,], a podobně pro pole vyšší dimenze.

Vícedimenzionální pole k dispozici je také pouze dílčí sadu funkcí, které jsou k dispozici pro jednorozměrné pole.For more information, see Collections.Array modul (F#), Collections.Array2D modul (F#), Collections.Array3D modul (F#), and Collections.Array4D modul (F#).

Dd233214.collapse_all(cs-cz,VS.110).giflogický Funkce pro pole

Funkce Array.exists a Array.exists2test prvky v jedné nebo dvou matic, resp.. Tyto funkce provést testfunkce a vrátit se true Pokud element (nebo dvojice prvek pro Array.exists2), splňuje podmínku.

Následující kód ukazuje použití Array.exists a Array.exists2.V těchto příkladech jsou vytvářeny nové funkce použitím pouze jednoho z argumentů v těchto případechargument funkce.

let allNegative = Array.exists (fun elem -> abs (elem) = elem) >> not
printfn "%A" (allNegative [| -1; -2; -3 |])
printfn "%A" (allNegative [| -10; -1; 5 |])
printfn "%A" (allNegative [| 0 |])
let haveEqualElement = Array.exists2 (fun elem1 elem2 -> elem1 = elem2)
printfn "%A" (haveEqualElement [| 1; 2; 3 |] [| 3; 2; 1|])

Výstup předchozího kódu je následující.

true
false
false
true

Podobně, funkceArray.forall testy k určení, zda každý prvek splňuje podmínku logický pole. Změna Array.forall2 provede stejnou akci pomocí logickýfunkce , která zahrnuje prvky dvou matic stejnou délku. Následující kód ilustruje použití těchto funkcí.

let allPositive = Array.forall (fun elem -> elem > 0)
printfn "%A" (allPositive [| 0; 1; 2; 3 |])
printfn "%A" (allPositive [| 1; 2; 3 |])
let allEqual = Array.forall2 (fun elem1 elem2 -> elem1 = elem2)
printfn "%A" (allEqual [| 1; 2 |] [| 1; 2 |])
printfn "%A" (allEqual [| 1; 2 |] [| 2; 1 |])

Pro tyto příklady výstup je následující.

false
true
true
false

Dd233214.collapse_all(cs-cz,VS.110).gifPole pro vyhledávání

Array.Find trvá logickýfunkce a vrátí první prvek, pro kterou vrátí funkce true, nebo vyvolává KeyNotFoundException Pokud je nalezen žádný prvek, který splňuje podmínku. Array.findIndex jako Array.find, která vrátí index prvku místo prvku samotného.

Následující kód používá Array.find a Array.findIndex vyhledejte číslo je čtvercový a dokonalé krychle.

let arrayA = [| 2 .. 100 |]
let delta = 1.0e-10
let isPerfectSquare (x:int) =
    let y = sqrt (float x)
    abs(y - round y) < delta
let isPerfectCube (x:int) =
    let y = System.Math.Pow(float x, 1.0/3.0)
    abs(y - round y) < delta
let element = Array.find (fun elem -> isPerfectSquare elem && isPerfectCube elem) arrayA
let index = Array.findIndex (fun elem -> isPerfectSquare elem && isPerfectCube elem) arrayA
printfn "The first element that is both a square and a cube is %d and its index is %d." element index

Výstup je takto.

The first element that is both a square and a cube is 64 and its index is 62.

Array.tryFind jako Array.find, s výjimkou, že výsledek je možnost Typ a vrátí None Pokud je nalezen žádný prvek.Array.tryFindměli používat namísto Array.find Pokud nevíte zda odpovídající prvek je v poli.Podobně Array.tryFindIndex jako Array.findIndex je možnost Typ vrácené hodnoty.Pokud je nalezen žádný prvek, je možnost None.

Následující kód ukazuje použití Array.tryFind.Tento kód závisí na předcházející kód.

let delta = 1.0e-10
let isPerfectSquare (x:int) =
    let y = sqrt (float x)
    abs(y - round y) < delta
let isPerfectCube (x:int) =
    let y = System.Math.Pow(float x, 1.0/3.0)
    abs(y - round y) < delta
let lookForCubeAndSquare array1 =
    let result = Array.tryFind (fun elem -> isPerfectSquare elem && isPerfectCube elem) array1
    match result with
    | Some x -> printfn "Found an element: %d" x
    | None -> printfn "Failed to find a matching element."

lookForCubeAndSquare [| 1 .. 10 |]
lookForCubeAndSquare [| 100 .. 1000 |]
lookForCubeAndSquare [| 2 .. 50 |]

Výstup je takto.

Found an element: 1
Found an element: 729

Použití Array.tryPick můžete transformovat prvek vedle ho.Výsledkem je první prvek, pro který funkce Vrátí transformovaný prvek jako hodnotu možnosti nebo None Pokud je nalezen žádný takový prvek.

Následující kód ukazuje použití Array.tryPick.Namísto lambda výraz, v tomto případě několik místní pomocná rutina funkce jsou definovány pro zjednodušení kódu.

let findPerfectSquareAndCube array1 =
    let delta = 1.0e-10
    let isPerfectSquare (x:int) =
        let y = sqrt (float x)
        abs(y - round y) < delta
    let isPerfectCube (x:int) =
        let y = System.Math.Pow(float x, 1.0/3.0)
        abs(y - round y) < delta
    // intFunction : (float -> float) -> int -> int
    // Allows the use of a floating point function with integers.
    let intFunction function1 number = int (round (function1 (float number)))
    let cubeRoot x = System.Math.Pow(x, 1.0/3.0)
    // testElement: int -> (int * int * int) option
    // Test an element to see whether it is a perfect square and a perfect
    // cube, and, if so, return the element, square root, and cube root
    // as an option value. Otherwise, return None.
    let testElement elem = 
        if isPerfectSquare elem && isPerfectCube elem then
            Some(elem, intFunction sqrt elem, intFunction cubeRoot elem)
        else None
    match Array.tryPick testElement array1 with
    | Some (n, sqrt, cuberoot) -> printfn "Found an element %d with square root %d and cube root %d." n sqrt cuberoot
    | None -> printfn "Did not find an element that is both a perfect square and a perfect cube."

findPerfectSquareAndCube [| 1 .. 10 |]
findPerfectSquareAndCube [| 2 .. 100 |]
findPerfectSquareAndCube [| 100 .. 1000 |]
findPerfectSquareAndCube [| 1000 .. 10000 |]
findPerfectSquareAndCube [| 2 .. 50 |]

Výstup je takto.

Found an element 1 with square root 1 and cube root 1.
Found an element 64 with square root 8 and cube root 4.
Found an element 729 with square root 27 and cube root 9.
Found an element 4096 with square root 64 and cube root 16.

Dd233214.collapse_all(cs-cz,VS.110).gifProvádí výpočty pro pole

Array.averagefunkce vrátí průměr každý prvek v matici. Je omezena na prvek typy, které podporují přesné dělení podle typu integer, zahrnující typy číslo s plovoucí desetinnou čárkou , ale není nedílnou typy.Array.averageByfunkce vrátí průměrné výsledky volání funkce na každý prvek. Pro pole typu nedílnou a použít Array.averageBy a funkcepřevést každý prvek typu číslo s plovoucí desetinnou čárkou pro stanovení.

Použití Array.max nebo Array.min získat maximální nebo minimální prvek, pokud je typ prvku podporuje.Podobně Array.maxBy a Array.minBy povolit funkce vykonávány jako první, případně převést na typ, který podporuje porovnání.

Array.Sum přidá prvky pole, a Array.sumBy volání funkce na jednotlivých prvků a výsledky společně.

provést funkce na každý prvek pole bez ukládání vrácené hodnoty, použijte Array.iter.funkce zahrnující dvě pole stejnou délku, použijte Array.iter2.Pokud potřebujete zachovat matici výsledků funkce, pomocí mapa nebo Array.map2, působí na dvě pole najednou.

Variace Array.iteri a Array.iteri2 povolit index prvku podílet výpočtu; Totéž platí pro Array.mapi a Array.mapi2.

Funkce Array.fold, Array.foldBack, Array.reduce, Array.reduceBack, Array.scan, a Array.scanBackprovést algoritmy, které zahrnují všechny prvky pole. Podobně varianty Array.fold2 a Array.foldBack2 provádět výpočty na dvou matic.

Tyto funkce pro výpočty provádění odpovídají funkcí se stejným názvem v seznam modul.Příklady využití viz Seznamy (F#).

Dd233214.collapse_all(cs-cz,VS.110).gifZměna pole

Array.set Nastaví prvek na zadanou hodnotu.Array.Fill Nastaví rozsah prvků v poli zadanou hodnotu.Následující kód znázorňuje, Array.fill.

let arrayFill1 = [| 1 .. 25 |]
Array.fill arrayFill1 2 20 0
printfn "%A" arrayFill1

Výstup je takto.

[|1; 2; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 23; 24; 25|]

Můžete použít Array.blit podsekce jednoho pole kopírovat do jiného pole.

Dd233214.collapse_all(cs-cz,VS.110).gifPřevod do a z jiných typů

Array.ofList vytvoří pole ze seznamu.Array.ofSeq vytvoří pole z sekvence.Array.toList a Array.toSeqpřevést na tyto další typy kolekce typu pole.

Dd233214.collapse_all(cs-cz,VS.110).gifTřídění polí

Použití Array.sort řazení pole pomocí funkceobecného porovnání.Použití Array.sortBy určit funkce generuje hodnotu, uvedené klíč, řazení pomocí obecného porovnání funkce na klíč.Použití Array.sortWith Chcete-li poskytnout porovnání vlastní funkce.Array.sort, Array.sortBy, a Array.sortWith všechny vrátí seřazené pole jako nové pole.Variace Array.sortInPlace, Array.sortInPlaceBy, a Array.sortInPlaceWith upravují stávající pole nevrací nový.

Dd233214.collapse_all(cs-cz,VS.110).gifMatice a n-tice

Funkce Array.zip a dekomprimovat metodou ZIPpřevést matic n-tice dvojic na n-tic matic a naopak. Array.zip3 a Array.unzip3 jsou podobné až na to, že pracují s n-tic tří prvků nebo n-tic tří polí.

Paralelní výpočty pro pole

modulArray.Parallel obsahuje funkce pro provedení paralelní výpočty polí. Tento modul není k dispozici v aplikacích, kterou cílová databáze verze.NET rozhraní .NET Framework verze 4.

Viz také

Další zdroje

F# Language Reference

Typy F#