计算对角线Elixir

时间:2018-04-19 01:57:07

标签: elixir elixir-framework

我需要在Elixir的矩阵中计算对角线。 例如:

2p, 3, 1s
4, 2ps, 1
5s, 3, 1p

Primary   = (1 + 2 + 2)
Secondary = (1 + 2 + 5)

Result = Secondary - Primary 

我尝试了N种方法但我无法帮助我解决这个难题。 感谢。

3 个答案:

答案 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,你应该没问题。