You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求协助:在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:57:15