在F#中切片2D数组但与Matlab类似?

时间:2014-12-08 16:05:21

标签: f# f#-interactive f#-3.0 c#-to-f# f#-data

我想知道是否有办法使用列表或int数组作为索引切片到数组中以获取f#中的子数组。

我知道你可以做以下事情

Arr2d.[*,1] or Arr2d.[1..5,1..2] etc...

但我正在寻找类似Matlab的东西,你可以写:

Arr2d([1;6;10],1) or Arr2d(1:10,[1;6;10])

是否可以在F#中进行切片?

谢谢!

以下是我的示例解决方案:(可能不是最佳但有效)

let sampleMatrix = Array2D.init 10 5 (fun x y -> y)

val sampleMatrix : int [,] = [[0; 1; 2; 3; 4]
                              [0; 1; 2; 3; 4]
                              [0; 1; 2; 3; 4]
                              [0; 1; 2; 3; 4]
                              [0; 1; 2; 3; 4]
                              [0; 1; 2; 3; 4]
                              [0; 1; 2; 3; 4]
                              [0; 1; 2; 3; 4]
                              [0; 1; 2; 3; 4]
                              [0; 1; 2; 3; 4]]

let idxlist = [1;3;4]

let array2dColumnSlice (idxlist:list<int>) (data:'T[,]) = 
  let tmp = [|for i in idxlist -> data.[*,i]|] 
  Array2D.init tmp.[0].Length tmp.Length (fun x y -> tmp.[y].[x] )

let slice = array2dColumnSlice idxlist sampleMatrix

val slice : int [,] = [[1; 3; 4]
                       [1; 3; 4]
                       [1; 3; 4]
                       [1; 3; 4]
                       [1; 3; 4]
                       [1; 3; 4]
                       [1; 3; 4]
                       [1; 3; 4]
                       [1; 3; 4]
                       [1; 3; 4]]

2 个答案:

答案 0 :(得分:1)

如详细here所示,除了您已经找到的内容之外,没有其他切片符号。

答案 1 :(得分:1)

仅对于范围,可以通过使用可切片类型包装Array2D,或使用旧的PowerPack的Matrix类型。

请参阅此处的文档:
http://msdn.microsoft.com/en-us/library/dd233214.aspx#sectionToggle6

  

您可以将此切片语法用于实现该元素的类型   访问运算符和重载的GetSlice方法。例如,   以下代码创建一个包装F#2D数组的Matrix类型,   实现Item属性以提供对数组索引的支持,以及   实现了GetSlice的三个版本。如果您可以使用此代码作为   您的矩阵类型的模板,您可以使用所有切片操作   本节描述的内容。