Умножьте каждый элемент n-мерного массива на число в Ruby - PullRequest
5 голосов
/ 14 октября 2011

Есть ли в Ruby простой способ умножить каждый элемент в n-мерном массиве на одно число?

такой, что: [1,2,3,4,5].multiplied_by 2 == [2,4,6,8,10]

и [[1,2,3],[1,2,3]].multiplied_by 2 == [[2,4,6],[2,4,6]]?

(Очевидно, я создал функцию multiplied_by, чтобы отличить ее от *, которая, по-видимому, объединяет несколько копий массива, что, к сожалению, не то, что мне нужно).

Спасибо!

Ответы [ 3 ]

6 голосов
/ 14 октября 2011

Длинный эквивалент этого выражения:

[ 1, 2, 3, 4, 5 ].collect { |n| n * 2 }

Это не так уж сложно.Вы всегда можете сделать свой метод multiply_by:

class Array
  def multiply_by(x)
    collect { |n| n * x }
  end
end

Если вы хотите, чтобы он умножался рекурсивно, вам нужно будет обработать это как особый случай:

class Array
  def multiply_by(x)
    collect do |v|
      case(v)
      when Array
        # If this item in the Array is an Array,
        # then apply the same method to it.
        v.multiply_by(x)
      else
        v * x
      end
    end
  end
end
3 голосов
/ 14 октября 2011

Как насчет использования Matrix класса из стандартной библиотеки ruby?

irb(main):001:0> require 'matrix'
=> true
irb(main):002:0> m = Matrix[[1,2,3],[1,2,3]]
=> Matrix[[1, 2, 3], [1, 2, 3]]
irb(main):003:0> m*2
=> Matrix[[2, 4, 6], [2, 4, 6]]
irb(main):004:0> (m*3).to_a
=> [[3, 6, 9], [3, 6, 9]]
1 голос
/ 14 октября 2011

Facets, как обычно, имеет несколько интересных идей:

>> require 'facets'
>> [1, 2, 3].ewise * 2
=> [2, 4, 6]

>> [[1, 2], [3, 4]].map { |xs| xs.ewise * 2 }
=> [[2, 4], [6, 8]]

http://rubyworks.github.com/facets/doc/api/core/Enumerable.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...