如何更新 Matrex 矩阵中的所有对角线值

How to update all diagonal values in Matrex matrix

我使用 Elixir Matrex (https://hexdocs.pm/matrex/Matrex.html) 并希望将所有对角线元素更新或设置为零(后来为零)。

我试过了:

matrix_size = 5
randommatrix = Matrex.random(matrix_size)

for index_i <- 1 .. matrix_size, do: randommatrix = Matrex.update(randommatrix, index_i, index_i, fn a -> 0 end)

#subsequent work with matrix that has all diagonal elements zero
#...

此方法仅更新随机矩阵“内部”理解,后续代码看到随机矩阵未更改。

我认为我可以通过递归函数来做我需要的事情,但是,有没有其他有效的方法(最少的计算机时间)?谢谢

你为什么不想让它成为递归?我认为这将是解决此问题的一种优雅方式。

像这样(代码测试):

update(matrix, 0), do: matrix
update(matrix, index) do
    update(
        Matrex.update(matrix, index, index, fn a -> 0 end),
        index-1
    )
end

调用示例:udpate(matrix, 5)

首先更新位置 (5,5) 的元素。从而创建一个新的矩阵。使用这个新矩阵,我们进入递归。接下来,更新位置 (4,4) 处的元素 - 依此类推。

终止条件是通过第二个参数的模式匹配完成的。所以当倒数到0时,除了返回完成的矩阵之外什么都不做。

如果不想使用递归,可以使用apply/2方法。这允许您将函数应用于矩阵的每个元素。更新函数获取相应的值和索引。这样我们就可以很容易地更新对角线上的所有值。

示例: 对于 5x5 矩阵,将更新以下索引:[1, 7, 13, 19, 25]。因此,如果我们对索引取模 6 (matrix_size + 1),则余数始终为 1。

matrix_size = 5
matrix = Matrex.random(matrix_size)
# Update diagonal to zero
Matrex.apply(matrix, fn val, index -> if rem(index, matrix_size+1) == 1 do 0 else val end)