F#Array2D-提取对角线

时间:2019-02-27 19:43:37

标签: matrix f# diagonal

让我们说我有一个矩阵

 [[0; 0; 1; 0; 0; 0]
  [0; 1; 0; 0; 0; 0]
  [2; 0; 0; 0; 0; 0]
  [0; 1; 0; 0; 0; 0]
  [0; 0; 1; 0; 0; 0]
  [0; 0; 0; 1; 0; 0]]

我想将对角线提取为一维数组,表示[|2;1;1|][|2;1;1;1|]

对于行和列,我们有

matrix.[i,*] // The ith row
matrix.[*,i] // the ith column

我们可以为第i个对角线的上下方向构造类似的东西吗?

2 个答案:

答案 0 :(得分:0)

我看不到建议的GetSlice方法语法将如何应用于您的方案。另一方面,提供Item索引器属性确实很容易提取对角线。

type 'a M = M of 'a list list with
    member me.Item i =
        let (M xss) = me in xss
        |> List.mapi (fun j ->
            List.mapi (fun k x ->
                if i = j - k then Some x else None )
            >> List.choose id )
        |> List.concat

给出一个矩阵作为列表列表:

let m =
 [[0; 0; 1; 0; 0; 0]
  [0; 1; 0; 0; 0; 0]
  [2; 0; 0; 0; 0; 0]
  [0; 1; 0; 0; 0; 0]
  [0; 0; 1; 0; 0; 0]
  [0; 0; 0; 1; 0; 0]]

M(m).[2] // val it : int list = [2; 1; 1; 1]

答案 1 :(得分:0)

除非您要使用一些外部库,否则它不会比以下库短很多。

let diag (mat: _ [,]) = 
    let l = min (mat.GetLength(0)) (mat.GetLength(1)) - 1
    [| for i in 0..l -> mat.[i,i] |]

我个人根本不认为这是一个问题,但这取决于您。当然,您可以使用Array.init或其他方法代替for循环,但是我更喜欢陈述的解决方案。