让我们说我有一个矩阵
[[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个对角线的上下方向构造类似的东西吗?
答案 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循环,但是我更喜欢陈述的解决方案。