我需要在Elixir的矩阵中计算对角线。 例如:
2p, 3, 1s
4, 2ps, 1
5s, 3, 1p
Primary = (1 + 2 + 2)
Secondary = (1 + 2 + 5)
Result = Secondary - Primary
我尝试了N种方法但我无法帮助我解决这个难题。 感谢。
答案 0 :(得分:1)
这是Kernel.SpecialForms.for/1
理解的完美用例:
input = [[2, 3, 1], [4, 2, 1], [5, 3, 1]]
for {row, idx} <- Enum.with_index(input),
{col, ^idx} <- Enum.with_index(row), do: col
#⇒ [2, 2, 1]
辅助对角线可能采用相同的方式(例如,使用保护作为列索引,或通过反转行。注意使用Kernel.SpecialForms.^/1
引脚运算符仅显式选择对角线元素。
列表的总和可能来自Enum.sum/1
:
Enum.sum(for {row, idx} <- Enum.with_index(input),
{col, ^idx} <- Enum.with_index(row), do: col)
#⇒ 5
答案 1 :(得分:1)
具有良好的旧枚举性:
第一个对角线:
[ [1, 2, 3], [4, 5, 6], [7, 8, 9] ]
|> Enum.with_index
|> Enum.map(fn({row, index}) -> Enum.at(row, index) end)
# => [1, 5, 9]
第二个对角线(与上面相同,但是反转了初始的二维数组):
[ [1, 2, 3], [4, 5, 6], [7, 8, 9] ]
|> Enum.reverse
|> Enum.with_index
|> Enum.map(fn({row, index}) -> Enum.at(row, index) end)
# => [7, 5, 3]
答案 2 :(得分:0)
以下是如何递归获取主对角线的示例,假设矩阵表示为嵌套列表。我将离开辅助对角线让你实施:
def primary_diag(matrix) do
do_primary_diag(matrix, 0, [])
end
defp do_primary_diag([], index, acc) do
Enum.reverse(acc)
end
defp do_primary_diag([row | rest], index, acc) do
val = Enum.at(row, index)
do_primary_diag(rest, index + 1, [val | acc])
end
请注意,这使用Enum.at
从行中获取指定索引处的值,这对于大型矩阵来说效率很低。对于3x3,你应该没问题。