【问题标题】:Slicing in a 2D Array in F# but similar to Matlab?在 F# 中切片二维数组但类似于 Matlab?
【发布时间】:2014-12-08 16:05:21
【问题描述】:

我想知道是否有一种方法可以使用一个列表或一个 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]]

【问题讨论】:

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


    【解决方案1】:

    正如here 所详述,除了您已经找到的之外,没有额外的切片符号。

    【讨论】:

      【解决方案2】:

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

      在此处查看文档:
      http://msdn.microsoft.com/en-us/library/dd233214.aspx#sectionToggle6

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

      【讨论】:

      • 我不认为这允许切片类似于给出的第二个示例。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-15
      • 2018-05-06
      相关资源
      最近更新 更多