请求协助:在Elixir中实现矩阵对角线差值计算
没问题,咱们一步步搞定这个Elixir矩阵对角线差值的问题。首先我注意到你的矩阵元素带了p/s后缀,所以第一步得先把每个元素里的数字提取出来,再计算对角线的和,最后求副减主的差值。
第一步:提取元素中的数字
先写个辅助函数,把带后缀的字符串转换成整数——核心是匹配字符串开头的数字部分,忽略后面的后缀:
defp extract_number(str) do case Regex.run(~r/^\d+/, str) do [num_str] -> String.to_integer(num_str) nil -> 0 # 兜底处理无数字的情况,你的示例里用不上,但留着更健壮 end end
第二步:把原始矩阵转成数字矩阵
假设你的原始矩阵用Elixir嵌套列表表示是这样的:
original_matrix = [ ["2p", "3", "1s"], ["4", "2ps", "1"], ["5s", "3", "1p"] ]
用Enum.map嵌套转换,得到纯数字的矩阵:
number_matrix = original_matrix |> Enum.map(&Enum.map(&1, &extract_number/1))
转换后得到:
[ [2, 3, 1], [4, 2, 1], [5, 3, 1] ]
第三步:计算主对角线的和
主对角线是每行中索引等于行号的元素(从0开始计数),用Enum.with_index给每行加索引,再累加对应元素:
primary_sum = number_matrix |> Enum.with_index() |> Enum.reduce(0, fn {row, idx}, acc -> acc + Enum.at(row, idx) end)
对应你的示例,主对角线元素是2(第一行第一个)、2(第二行第二个)、1(第三行第三个),总和是2+2+1=5,和你给出的结果一致。
第四步:计算副对角线的和
副对角线是每行中**索引等于「矩阵大小-1-行号」**的元素,先拿到矩阵的行数,再按规则累加:
matrix_size = length(number_matrix) secondary_sum = number_matrix |> Enum.with_index() |> Enum.reduce(0, fn {row, idx}, acc -> acc + Enum.at(row, matrix_size - 1 - idx) end)
你的示例里,副对角线元素是1(第一行第三个)、2(第二行第二个)、5(第三行第一个),总和是1+2+5=8,和你说的一致。
第五步:计算最终差值
直接用副对角线和减去主对角线和就行:
difference = secondary_sum - primary_sum
完整代码封装
把这些逻辑封装成一个模块,方便复用:
defmodule MatrixDiagonal do def calculate_difference(original_matrix) do number_matrix = original_matrix |> Enum.map(&Enum.map(&1, &extract_number/1)) matrix_size = length(number_matrix) primary_sum = number_matrix |> Enum.with_index() |> Enum.reduce(0, fn {row, idx}, acc -> acc + Enum.at(row, idx) end) secondary_sum = number_matrix |> Enum.with_index() |> Enum.reduce(0, fn {row, idx}, acc -> acc + Enum.at(row, matrix_size - 1 - idx) end) secondary_sum - primary_sum end defp extract_number(str) do case Regex.run(~r/^\d+/, str) do [num_str] -> String.to_integer(num_str) nil -> 0 end end end # 测试你的示例 original_matrix = [ ["2p", "3", "1s"], ["4", "2ps", "1"], ["5s", "3", "1p"] ] IO.puts(MatrixDiagonal.calculate_difference(original_matrix)) # 输出3,也就是8-5的结果
这个代码完全适配你的需求,运行后会输出3,和你预期的计算结果一致。如果你的矩阵是其他大小的方阵,这个代码也能正常工作~
内容的提问来源于stack exchange,提问作者PoolandTech
相关产品推荐
相关产品推荐

