Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F#阵列2D切片_F# - Fatal编程技术网

F#阵列2D切片

F#阵列2D切片,f#,F#,是否可以在F#中切片阵列2d? 说, 让tmp=Array2D.init 100 100(乐趣x y->x*100+y) 如何从tmp中检索一些列或行,如tmp.[0,1..]?是的,可以尝试此tmp.[0..0,1..] let tmp = Array2D.init 100 100 (fun x y -> x * 100 + y) printf "%A" tmp.[1..2, ..3] [[100; 101; 102; 103] [200; 201; 202; 203]] 如果只需

是否可以在F#中切片阵列2d? 说,
让tmp=Array2D.init 100 100(乐趣x y->x*100+y)


如何从
tmp
中检索一些列或行,如
tmp.[0,1..]

是的,可以尝试此
tmp.[0..0,1..]

let tmp = Array2D.init 100 100 (fun x y -> x * 100 + y)
printf "%A" tmp.[1..2, ..3]

[[100; 101; 102; 103]
 [200; 201; 202; 203]]
如果只需要一行或一列,则必须重复该数字

[1..1, 2..3]
[1..2, 2..2]
如果你想达到或超过这个数字,就把这个数字删掉

[1.., 2..3]
[..2, 2..2]
数组切片始终返回相同的顺序数组

> tmp.[1..1, 2..2]
val it : int [,] = [[102]]

> tmp.[1..1, 2..2].[0, 0]
val it : int = 102

对。抓取二维块很容易:

tmp.[10..20,30..40]
但是,如果您想要1D切片,我相信您需要将其从2D切片中投影出来

tmp.[0..0,1..] |> fun arr -> Array.init 99 (fun i -> arr.[0,i])

当从二维数组中提取一维剖面时,我发现使用
Seq.Cast
非常方便。它从二维数组中按左右/上下顺序生成元素

像这样:

let A = array2D [[1;2;3];[4;5;6];[7;8;9]]

let flatten (A:'a[,]) = A |> Seq.cast<'a>

let getColumn c (A:_[,]) =
    flatten A.[*,c..c] |> Seq.toArray

let getRow r (A:_[,]) =
    flatten A.[r..r,*] |> Seq.toArray  
设A=array2D[[1;2;3];[4;5;6];[7;8;9]]

让我们把(A:'A[,])=A |>顺序演员展平你自己已经给出了答案

问题中的示例代码将为您提供所需的内容。 我只是稍微改变了一下,以更好地证明它是有效的

let tmp = Array2D.init 10 10 (fun x y -> sprintf "%d,%d" x y)
//3rd row
let row3 = tmp.[2,0..]
//2nd column
let col2 = tmp.[0..,1]
;;
这里的关键是对行或列使用单个值。然后,它会将一个切片作为1D数组提供给您。如果对行和列都使用范围,则得到的切片类型为Array2D

编辑:适用于Visual F#3.1.1,旧版本未经测试。

在F#3.1中,您可以执行以下操作:

// Get row 3 from a matrix as a vector:
matrix.[3, *]

// Get column 3 from a matrix as a vector:
matrix.[*, 3]

(请参阅)

太好了,然后我也会翻页和其他东西。也许你应该补充一点,这是一个新的F#功能-问题有点老了-但仍然是一个有价值的更新-谢谢你再次浏览这些旧东西!Thx,如果我知道的话我会的。我使用的是Visual F#3.1.1,它可以工作-不知道旧版本。有没有一种有效的方法来获得对角线?
// Get row 3 from a matrix as a vector:
matrix.[3, *]

// Get column 3 from a matrix as a vector:
matrix.[*, 3]