2014-09-02 6 views
3

행렬의 각 행에 임의의 숫자를 곱하고 싶습니다. rand()의 항목을 포함하는 크기 TxN의 대각 행렬 및 R매우 큰TN 규모 NxM의 매트릭스와 X 행렬의 각 행에 임의의 숫자를 곱하는 가장 좋은 방법

Y = R*X 

. 내가 사용하는 순간

r = rand(T) 
Y = scale(r, X) 

그러나 이것이 더 빠르고 더 나은지 궁금합니다. 예를 들어, 벡터 r을 만들 필요는 없다고 생각하지만, y[i] = rand()*X[i,:]을 효율적으로/병렬로 호출하는 방법을 모르겠습니다.

+0

귀하의 경우'scale() '을 호출하는 것과 비교하여'r'을 만드는 데 얼마나 오래 걸립니까? –

+0

임시 'r'을 만들고 싶습니다. 그 이유는 행에 의해'X '를 트래버스하는 것이 지독히 비효율적이기 때문에, 컬럼별로 트래버스하는 것이 5-10 배 더 빠릅니다. 따라서이 경우 임시 'r'을 할당하고 열을 (즉 메모리 저장 순서로) 'X'를 이동하면 큰 이점을 얻게됩니다. 특히 'X'와 'r'이 'Float32'인 경우이 경우 SIMD가 벡터화되어야합니다. – tholy

답변

5

당신은 장소에 X을 수정 scale!을 사용할 수 있습니다 : 이것은 메모리와 시간을 크게 절감하는 새로운 매트릭스를 할당 방지

julia> X = [ 1/(i + j - 1) for i=1:5, j=1:5 ] 
5x5 Array{Float64,2}: 
1.0  0.5  0.333333 0.25  0.2 
0.5  0.333333 0.25  0.2  0.166667 
0.333333 0.25  0.2  0.166667 0.142857 
0.25  0.2  0.166667 0.142857 0.125 
0.2  0.166667 0.142857 0.125  0.111111 

julia> r = rand(5) 
5-element Array{Float64,1}: 
0.98996 
0.88145 
0.808518 
0.632665 
0.00807468 

julia> scale!(r,X); 

julia> X 
5x5 Array{Float64,2}: 
0.98996  0.49498  0.329987 0.24749  0.197992 
0.440725 0.293817 0.220363 0.17629  0.146908 
0.269506 0.20213  0.161704 0.134753 0.115503 
0.158166 0.126533 0.105444 0.0903807 0.0790832 
0.00161494 0.00134578 0.00115353 0.00100933 0.000897187 

합니다.

+0

nice, +1에 대한 'scale!' –

+0

Thx. 윌 스케일! 다중 코어를 사용합니까? –

+0

현재 다중 코어를 사용하지 않습니다. – StefanKarpinski

관련 문제