F#从一个正方形矩阵创建一个正方形子矩阵



我在F#中有一个函数,我希望它只从一个平方矩阵创建一个平方子矩阵。我需要做的是从原始矩阵中删除一行和一列,并将其转换为子矩阵。这就是我迄今为止所尝试的:

/// <param name="A">An N-by-N matrix.</param>
/// <param name="i">The index of the row to remove.</param>
/// <param name="j">The index of the column to remove.</param>
/// <returns>The resulting (N - 1)-by-(N - 1) submatrix.</returns>
static member SquareSubMatrix (A : Matrix) (i : int) (j : int) : Matrix =
let m_rows = A.M_Rows
let n_cols = A.N_Cols

let toarr = A.ToArray()
let retval = toarr.[0..m_rows-1,0..n_cols-1]

Matrix retval

M_Rows和N_Cols只是一个自定义函数,用于获取矩阵的行数和列数,ToArray函数顾名思义。

所以我试着把矩阵转换成一个数组,这样我就可以对它进行切片,然后再把它转换回来,但我不确定如何从数组中切出特定的行/列。上面的代码只是返回输入矩阵,因为它没有对任何东西进行切片,因为我不知道如何进行

我猜A.ToArray()会给您返回一个多维数组——就像您对它进行切片一样,它会再次枚举所有列和所有行。

AFAIK不能使用切片表示法去掉一行,只能取范围。因此,一种函数方法可以是将上半部分/下半部分切片,然后将这些半部分分别切片为左/右,并具有将列/行凹陷的函数。我认为最后一个函数不是基本库的一部分,所以你必须自己编写这些函数。

无论如何,F#是一种混合语言,在本地对内容进行变异并不是什么真正的问题,这样你就可以使用一个更迫切的解决方案:我建议使用Array2D.blit:复制出4个部分(左上、右上、左下、右下(

所以这应该有效:


let sourceArr = A.ToArray()
let targetArr = Array2D.create (m_rows-1) (n_cols-1)
// top-left
Array2D.blit sourceArr 0 0 targetArr 0 0 i j
// bottom-left
Array2D.blit sourceArr (i+1) 0 targetArr i 0 (m_rows-i-1) j
// top-right
Array2D.blit sourceArr 0 (j+1) targetArr 0 j i (n_cols-j-1)
// bottom-right
Array2D.blit sourceArr (i+1) (j+1) targetArr i j (m_rows-i-1) (n_cols-j-1)
// continue with targetArr

如果我没有把索引数学搞砸(很有可能(,这应该会起作用——我想你已经明白的想法了

最新更新