如何更新 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)
我使用 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)