【问题标题】:How to sum two matrices?如何对两个矩阵求和?
【发布时间】:2014-08-18 06:13:20
【问题描述】:

如何编写一个接受两个方阵(nxn 二维数组)并返回两者之和的方法。传入该方法的两个矩阵的大小均为 nxn(正方形),仅包含整数。

如何对两个矩阵求和: 从第一个矩阵中取出每个单元格 [n][m],并将其与第二个矩阵中的 [n][m] 个单元格相加。这将是解矩阵中的单元格 [n][m]。

喜欢:

|1 2 3|
|3 2 1|
|1 1 1|
+
|2 2 1|
|3 2 3|
|1 1 3|
=
|3 4 4|
|6 4 4|
|2 2 4|



matrix_addition( [ [1, 2, 3], [3, 2, 1,], [1, 1, 1] ], [ [2, 2, 1], [3, 2, 3], [1, 1, 3] ] )
returns [ [3, 4, 4], [6, 4, 4], [2, 2, 4] ]

【问题讨论】:

  • 你尝试过什么吗?你试过什么?

标签: ruby matrix


【解决方案1】:

尽管可以定义方法来做到这一点,但在 Matrix 库中使用 ruby​​ 构建会更容易:

require 'matrix'

m1 = Matrix[ [1, 2, 3], [3, 2, 1], [1, 1, 1] ]
m2 = Matrix[ [2, 2, 1], [3, 2, 3], [1, 1, 3] ]

sum = m1 + m2

【讨论】:

  • ...和sum.to_aMatrix 对象sum 转换为数组。添加的数组不必是方形的;它们只是必须具有相同的行数和相同的列数。
【解决方案2】:

是的,当然,使用 Matrix 类方法,但这里有一种使用递归的方法,可能会引起人们的兴趣。

代码

def sum_arrays(a1, a2)
  t = a1.zip(a2)
  t.map { |e1,e2| (e1.is_a? Array) ? sum_arrays(e1,e2) : e1+e2 }
end

示例

a1 = [1,2,3]
a2 = [4,5,6]
sum_arrays(a1, a2)
  #=> [5, 7, 9]

a1 = [[1,2,3], [4,5]]
a2 = [[6,7,8], [9,10]]
sum_arrays(a1, a2)
  #=> [[7, 9, 11], [13, 15]]

a1 = [[[ 1,  2,  3], [ 4,  5]],
      [[ 6,  7], [ 8,  9, 10]]] 
a2 = [[[11, 12, 13], [14, 15]],
      [[16, 17], [18, 19, 20]]]
sum_arrays(a1, a2)
 #=> [[[12, 14, 16], [18, 20]],
 #    [[22, 24], [26, 28, 30]]]

泛化

您可以通过传递一个运算符来更好地使用此方法。

代码

def op_arrays(a1, a2, op)
  t = a1.zip(a2)
  t.map { |e1,e2| (e1.is_a? Array) ? op_arrays(e1,e2,op) : e1.send(op,e2) }
end

示例

a1 = [[1,2,3], [4,5]]
a2 = [[6,7,8], [9,10]]

op_arrays(a1, a2, '+') #=> [[7, 9, 11], [13, 15]]
op_arrays(a1, a2, '-') #=> [[-5, -5, -5], [-5, -5]]
op_arrays(a1, a2, '*') #=> [[6, 14, 24], [36, 50]]

您也可以将运算符作为符号传递:

op_arrays(a1, a2, :+)
  #=> [[7, 9, 11], [13, 15]]

【讨论】:

  • 这很好用,看看你如何在没有#Matrix 库的情况下做到这一点很有趣。
【解决方案3】:

你用过rubyMatrix class吗? 它有#+ 运算符(模拟方法)。

【讨论】:

  • 由于您的回答对@BroiSatse 之前的回答没有任何帮助,您应该将其删除 [您的,而不是他的 :-)]。
  • 好吧,我以前不知道他的回答。我们几乎同时回答了这个问题。想一想,我添加了指向 Matrix 类的链接,以便提问者可以正确学习 Matrix#+ 运算符。 :-)
猜你喜欢
  • 1970-01-01
  • 2017-04-13
  • 1970-01-01
  • 1970-01-01
  • 2016-04-07
  • 1970-01-01
  • 2022-01-03
  • 1970-01-01
  • 2019-10-04
相关资源
最近更新 更多