如何在Ruby中执行向量加法?

iklwldmw  于 11个月前  发布在  Ruby
关注(0)|答案(6)|浏览(112)

如何在Ruby中执行向量加法,

[100, 100] + [2, 3]

字符串
收益率

[102, 103]


(而不是连接两个数组)?
或者它也可以是另一个操作符,例如

[100, 100] @ [2, 3]


[100, 100] & [2, 3]

flvtvl50

flvtvl501#

请参阅Vector类:

require "matrix"

x = Vector[100, 100]
y = Vector[2, 3]
print x + y

E:\Home> ruby t.rb
Vector[102, 103]

字符串
有关向量的其他操作,请参见vectorops
.以下操作按预期工作

v1 = Vector[1,1,1,0,0,0]
  v2 = Vector[1,1,1,1,1,1]

  v1[0..3]
  # -> Vector[1,1,1]

  v1 += v2
  # -> v1 == Vector[2,2,2,1,1,1]

  v1[0..3] += v2[0..3]
  # -> v1 == Vector[2,2,2,0,0,0]

  v1 + 2
  # -> Vector[3,3,3,1,1,1]


这就是vectorops
请注意,matrix is no longer a default gem从Ruby 3.1.0开始。感谢Dan Murphy提到这一点。

kokeuurv

kokeuurv2#

数组#zip:

$ irb
irb(main):001:0> [100,100].zip([2,3]).map { |e| e.first + e.last }
=> [102, 103]

字符串
较短:

irb(main):002:0> [100,100].zip([2,3]).map { |x,y| x + y }
=> [102, 103]


使用#inject推广到>2维:

irb(main):003:0> [100,100,100].zip([2,3,4]).map { |z| z.inject(&:+) }
=> [102, 103, 104]

qcbq4gxm

qcbq4gxm3#

或者,如果您想要该变量的任意维行为(如数学向量加法),

class Vector < Array
   def +(other)
     case other
     when Array
       raise "Incorrect Dimensions" unless self.size == other.size
       other = other.dup
       self.class.new(map{|i| i + other.shift})
     else
       super
     end
   end
 end

class Array
  def to_vector
    Vector.new(self)
  end
end 

[100,100].to_vector + [2,3] #=> [102,103]

字符串
缺少lisp风格的Map是非常令人讨厌的。

qrjkbowd

qrjkbowd4#

当你在蒙得维的亚的时候。

module Enumerable
  def sum
    inject &:+
  end

  def vector_add(*others)
    zip(*others).collect &:sum
  end
end

字符串
然后你可以执行.vector_add(B),它就可以工作了。我相信这需要Ruby 1.8.7,或者添加Symbol.to_proc的扩展。你也可以用这种方式添加任意数量的向量。

lztngnrs

lztngnrs5#

作为一个旁注,如果你(像我一样)对ruby中默认Vector类提供的操作不满意,可以考虑看看我的gem https://github.com/psorowka/vectorops,它增加了一些我期望从适当的Vector实现中获得的功能。

jobtbby3

jobtbby36#

module PixelAddition
  def +(other)
    zip(other).map {|num| num[0]+num[1]}
  end
end

字符串
然后你可以创建一个Array子类,混合在模块中,或者将行为添加到特定的数组中,比如:

class <<an_array
  include PixelAddition
end

相关问题