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
如果我没有弄乱索引数学(很有可能),这应该可行 - 我想你明白了
我在 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
:
所以这应该有效:
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
如果我没有弄乱索引数学(很有可能),这应该可行 - 我想你明白了