2011-10-14 2 views
4

Ruby에서 n 차원 배열의 모든 요소에 단일 숫자를 간단하게 곱할 수 있습니까?n 차원 배열의 모든 요소에 Ruby의 숫자를 곱하면됩니다.

있도록 : [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]]?

(분명히 *과 구별하기 위해 함수를 만들었습니다.이 배열은 여러 복사본을 연결하는 것으로 보이는데, 불행히도 필요한 것은 아닙니다.)

감사합니다.

+1

2 차원 배열 리터럴은'[[1, 2, 3], [1, 2, 3]] '와 같이 작성해야합니다. 불행히도 6 문자 임계 값으로 인해이를 해결할 수 없습니다. –

+0

좋은 장소, 고마워. 분명히 그 한계는 나에게 적용되지 않는다. 그래서 나는 그것을 바꿨다. – Russell

답변

6

이의 긴 형태의 것과 동일합니다 :

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

그것은 정말 복잡하지 않습니다. 당신이 반복적으로 증식 할 경우 특별한 경우로 것을 처리해야합니다,

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 
+0

배열에 둘 이상의 차원이있는 경우에는 작동하지 않습니다. – Russell

+0

고마워요. 나는 이것이 내 질문에 답하는 것 같아요 - 그것을하기위한 '미리 조리 된'방법이 없습니다. 비록 그것이 간단하더라도, 나는 오히려 내장 함수를 사용하고 싶습니다. 휠을 재발 명할 필요가 없습니다. – Russell

+0

예, 이런 종류의 내장 메소드가 없지만, 좋은 소식은 기존 패치를 깨지 않는 한 핵심 클래스에 패치를 추가하는 것이 좋습니다. 주의 할 점은 메서드를 추가하기 전에 정의되어 있는지 확인해야하며 이미 존재하는 경우 경고 할 수도 있습니다. – tadman

1

패싯, 평소와 같이, 몇 가지 참신한을 가지고 당신은 항상 당신의 multiply_by 방법을 만들 수 아이디어 :

>> 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

+0

다차원 배열에서 작동하지 않는 것 같습니다. 내가 놓친 게 있니? – Russell

+0

아니요, 그렇지 않습니다. 지도가 뭐가 잘못 되었나요? 명시 적 (보통) 암시 적보다 낫다. – tokland

+0

지도에 아무 문제가 없습니다. 그러나 데이터는 다른 (제 3 자) 응용 프로그램에서 가져 오므로 구조에 대한 제어권이 없습니다. 작업이 매우 간단하다는 것을 알았 기 때문에 현재 상태에서 벗어날 수있을 것이라고 생각하고 단일 작업을 수행 한 다음 다시 변환하기 위해 맵으로 변환하는 오버 헤드를 피하십시오. – Russell

3

방법 루비 표준 라이브러리에서 Matrix 클래스를 사용하는 것에 대해?

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]] 
관련 문제