F# 从方阵创建方子矩阵

F# Creating a square sub-matrix from a square matrix

我在 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函数顾名思义

所以我尝试将矩阵转换成数组,这样我就可以对其进行切片,然后将其转换回来,但我不确定如何从数组中切出特定的 row/column。上面的代码只是 returns 输入矩阵,因为它不会对任何内容进行切片,导致我不确定该怎么做。

我想 A.ToArray() returns 你是一个多维数组 - 你切片的方式再次枚举所有列和所有行。

据我所知,您不能使用切片表示法取出一行 - 您只能取范围。 因此,一种功能性方法可能是将 upper/lower 切成两半,然后将这些半切成 left/right,并具有连接 columns/rows 的函数。 我认为最后一个函数不是基础库的一部分,因此您必须自己编写这些函数。

无论如何,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

如果我没有弄乱索引数学(很有可能),这应该可行 - 我想你明白了