【问题标题】:F# Creating a square sub-matrix from a square matrixF# 从方阵创建方子矩阵
【发布时间】:2021-06-08 03:51:28
【问题描述】:

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

所以我尝试将矩阵转换为数组,以便可以对其进行切片,然后将其转换回来,但我不确定如何从数组中切出特定的行/列。上面的代码只是返回输入矩阵,因为它没有对任何东西进行切片,导致我不知道该怎么做。

【问题讨论】:

    标签: arrays matrix vector f# slice


    【解决方案1】:

    我猜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
    

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

    【讨论】:

    • 是的,Matrix 是一个自定义函数,用于将 Array 转换为矩阵自定义类型
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-29
    • 2017-08-02
    • 1970-01-01
    • 2012-03-16
    • 2020-08-11
    • 1970-01-01
    相关资源
    最近更新 更多